AC修炼计划(AtCoder Regular Contest 162)

传送门:AtCoder Regular Contest 162 - AtCoder

A题签到

B - Insertion Sort 2

我们可以从头开始一个一个排序,把1通过操作放到第一个,把2通过操作放到第二个。。。以此类推。但会出现一种情况,如果我们所要排的数字在最后一位,该怎么办呢?那么我们需要把倒数第三位和倒数第四位的数字插到最后一位数字的后面,然后再按照上述的操作进行。当然,如果排到第n-1个数字时,n-1在最后一位,则无法进行操作,则数组不成立。

代码如下:

#pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const int MX=0x3f3f3f3f3f3f3f3f; 
int n,m;
int b[1000005];
int id[1000005];
void icealsoheat(){

    cin>>n;
    vector<PII>ans;
    for(int i=1;i<=n;i++){
        cin>>b[i];
        id[b[i]]=i;
    }
    for(int i=1;i<n;i++){
        if(b[i]==i)continue;
        if(id[i]==n&&i==n-1){
            cout<<"No";
            return;
        }
        if(id[i]==n){
            ans.push_back({n-2,n-2});
            int xx=b[n];
            b[n]=b[n-1];
            b[n-1]=b[n-2];
            b[n-2]=xx;
            id[b[n]]=n;
            id[b[n-1]]=n-1;
            id[b[n-2]]=n-2;
        }
        if(b[i]==i)continue;
            ans.push_back({id[i],i-1});
            int r=id[i]+1;
            int xx=b[r];
            for(int j=r;j>=i+2;j--){
                b[j]=b[j-2];
                id[b[j]]=j;
            }
            b[i]=i;
            b[i+1]=xx;       
            id[b[i]]=i;
            id[b[i+1]]=i+1;
    }
    cout<<"Yes\n";
    cout<<ans.size()<<"\n";
    for(auto [i,j]:ans){
        cout<<i<<" "<<j<<"\n";
    }

}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _yq;
    _yq=1;
    // cin>>_yq;
    while(_yq--){
        icealsoheat();
    }
}

C - Mex Game on Tree

这道题其实很好判断,就是在一个子树中,要保证不存在含有k的子节点,其次还要有1到k-1的节点,才算成立。并且对于Bob来说,他会想进办法把k放入树中。所以,Alice必须在第一步就获得我们需要的值。那么我们不难想到,要么最开始就有符合要求的子树,要么就是差一个数就满足上述要求的子树(这种情况Alice第一步直接放入所需要的数就可以了)

代码如下:

#pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const int MX=0x3f3f3f3f3f3f3f3f; 
int n,k;
int a[1000005];
int p[1000005];
void icealsoheat(){
    cin>>n>>k;
    vector<vector<int>>ve(n+5);
    vector<vector<int>>dp(n+5,vector<int>(1005,0));
    vector<int>ge(n+5,0);
    for(int i=2;i<=n;i++){
        cin>>p[i];
        ve[p[i]].push_back(i);
    }
    for(int i=1;i<=n;i++)cin>>a[i];
    bool f=0;
    auto dfs=[&](auto self,int x)->void{
        if(a[x]>=0){
            dp[x][a[x]]=1;
        }
        ge[x]=1;
        for(auto i:ve[x]){
            self(self,i);
            for(int j=0;j<=n;j++){
                dp[x][j]+=dp[i][j];
            }
            ge[x]+=ge[i];
        }

        if(dp[x][k]==0){
            int an=0;
            int nn=0;
            for(int j=0;j<=n;j++){
                if(j<k){
                    if(dp[x][j])an++;
                }
                nn+=dp[x][j];
            }
            if(an==k-1&&ge[x]-nn==1){
                f=1;
            }
            else if(an==k&&ge[x]-nn<=1){
                f=1;
            }
        }



    };

    dfs(dfs,1);
    if(f)puts("Alice");
    else puts("Bob");
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _yq;
    _yq=1;
    cin>>_yq;
    while(_yq--){
        icealsoheat();
    }
}

D - Smallest Vertices

参考文献:ARC162 简要题解 - syzf2222 的博客 - 洛谷博客 (luogu.com.cn)

以及你别想再给我走了! (cnblogs.com)

从这题开始,发现自己开始力不从心了。好难好难。。。

首先,我们需要知道基本的prufer序列的一些知识:

一棵n个点的带标号生成树唯一对应一个长度为 n-2的Prufer 序列。

 Prufer 序列是这样构造的:每次选出编号最小的叶子节点(没有子节点的点),将它删去,并将它相连的点加入序列中,直到进行n−2 次后剩两个点。一个点prufer 序列中出现的次数为度数-1。每个数都可能在prufer 序列的每个位置出现。

第三个结论是解决本题的关键。

对于一个子树而言,如果该子树的根节点对答案有贡献,则该子树除根节点以外的节点的数字一定要大于根节点。

一个出度为drt的节点为根的生成树数量为:

设以x为根节点的集合S,|S|为该集合的数量,集合中不存在比x更小的节点。我们还要保证集合中出度的和为|S|-1,满足上述条件才能加上此贡献。我们可以用dp去维护,dp j k ,j表示我们选了多少个数,k表示这些数的出度的和。该节点的贡献为

最后节点1的要特殊单独计算。

代码如下:

#pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int mod=998244353;
const int MX=0x3f3f3f3f3f3f3f3f; 
int fac[1000];
int ifac[1000];
int kuai(int a,int b){
    int ans=1;
    while(b){
        if(b&1)ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return  ans%mod;
}
inline ll C(ll n, ll m) {
    if (n < m || n < 0 || m < 0) {
        return 0;
    } else {
        return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
    }
}
int n;
int d[1000];
void icealsoheat(){
    cin>>n;
    ifac[0]=fac[0]=1;
    for (int i = 1; i <= 505; ++i) {
        fac[i] = fac[i - 1] * i % mod;
    }
    ifac[505] = kuai(fac[505], mod - 2);
    for (int i = 505 - 1; ~i; --i) {
        ifac[i] = ifac[i + 1] * (i + 1) % mod;
    }
    int res=1;
    for(int i=1;i<=n;i++){
        cin>>d[i];
        // if(d[i]){
        //     res=res*d[i]%mod;
        // }
        res=res*ifac[d[i]]%mod;
    }
    vector dp(n+5,vector<int>(505,0));
    dp[0][0]=1;
    // res=kuai(res,mod-2);
    int ans=0;
    for(int i=n;i>=2;i--){
        if(d[i]){
            for(int j=d[i];j<=n-i;j++){
                int xx=dp[j][j-d[i]];
                xx=xx*d[i]%mod*d[1]%mod;
                xx=xx*fac[j-1]%mod*fac[n-j-2]%mod;
                xx=xx*res%mod;
                ans=(ans+xx)%mod;
            }
        }
        for(int j=n-i+1;j>=0;j--){
            for(int k=n;k>=0;k--){
                if(k>=d[i]&&j){
                    dp[j][k]=(dp[j][k]+dp[j-1][k-d[i]])%mod;
                }
            }
        }
        if(!d[i]){
            int xx=fac[n-2]*d[1]%mod*res%mod;
            ans=(ans+xx)%mod;
        }
    }
    int xx=fac[n-2]*d[1]%mod;
    xx=xx*res%mod;
    ans+=xx;
    cout<<ans%mod;

}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _yq;
    _yq=1;

    // cin>>_yq;

    while(_yq--){
        icealsoheat();
    }
}

E - Strange Constraints

好厉害的题,我完全想不到,也看题解了好长时间,感觉长脑子了,完全没想到竟然还可以这个样子。

 

参考文献:AT_arc162_e [ARC162E] Strange Constraints - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码如下:

#pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int mod=998244353;
const int MX=0x3f3f3f3f3f3f3f3f; 

int dp[505][505][505];
int fac[10005];
int ifac[10005];
int kuai(int a,int b){
    int ans=1;
    while(b){
        if(b&1)ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans%mod;
}
int b[10005];
inline ll C(ll n, ll m) {
    if (n < m || n < 0 || m < 0) {
        return 0;
    } else {
        return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
    }
}
int n;
void icealsoheat(){
    cin>>n;
    fac[0]=1;
    for (int i = 1; i <= n; ++i) {
        fac[i] = fac[i - 1] * i % mod;
    }
    ifac[n] = kuai(fac[n], mod - 2);
    for (int i = n - 1; i>=0; --i) {
        ifac[i] = ifac[i + 1] * (i + 1) % mod;
    }
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        b[x]++;
    }
    b[n+1]=0;
    int ans=0;
    for(int i=n-1;i>=1;i--)b[i]+=b[i+1];
    dp[n+1][0][0]=1;
    for(int i=n;i>=1;i--){
        for(int j=0;j*(i+1)<=n&&j<=b[i+1];j++){
            for(int k=0;k<=b[i+1];k++){
                if(dp[i+1][j][k]==0)continue;
                int f=1;
                for(int x=0;j+x<=n&&k+x*i<=b[i];x++){
                    dp[i][j+x][k+i*x]+=dp[i+1][j][k]*C(b[i]-j,x)%mod*fac[b[i]-k]%mod*f%mod*ifac[b[i]-k-i*x]%mod;
                    dp[i][j+x][k+i*x]%=mod;
                    f=f*ifac[i]%mod;
                }
            }
        }
    }
    for(int i=0;i<=b[1];i++){
        ans=(ans+dp[1][i][n])%mod;
    }
    cout<<ans;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _yq;
    _yq=1;
    // cin>>_yq;
    while(_yq--){
        icealsoheat();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/149862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试经典(6/150)轮转数组

面试经典&#xff08;6/150&#xff09;轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 以下为自己的思路&#xff0c;我不明白最终的返回值为什么有误&#xff0c;好像是题目里要求原地解决问题&#xff0c;而我创…

基于鸽群算法优化概率神经网络PNN的分类预测 - 附代码

基于鸽群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于鸽群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于鸽群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

电子电机行业万界星空科技MES解决方案

现在电子电机行业规模越来越大&#xff0c;也伴随着生产和管理成本走向变高的现象。针对这个问题&#xff0c;mes系统就成为各电子电机制造业的最优选择。 电子机电行业MES涵盖了从原材料采购到最终产品交付的整个过程&#xff0c;包括生产计划、物料管理、生产过程监控、质量…

数字化档案管理系统解决方案

数字化档案管理系统解决方案是指将传统的纸质档案转化为数字化档案&#xff0c;采用计算机和网络技术实现对档案的存储、检索、管理、共享等操作的过程。 专久智能数字化档案管理解决方案及措施可以包括以下几个方面&#xff1a; 1. 采用数字化技术对档案进行数字化处理&#x…

kubernetes--资源调度

目录 一、自动调度 1. Pod 启动创建过程&#xff1a; 2. 调度过程&#xff1a; 2.1 调度分为几个部分&#xff1a; 2.2 常见的预算策略&#xff08; Predicate &#xff09;&#xff1a; 2.3 常见的优选策略&#xff08;priorities&#xff09;&#xff1a; 二、定向调度&…

性能小课堂:Jmeter录制手机app脚本!

环境准备&#xff1a;1.手机2.wifi3.Jmeter 具体步骤&#xff1a; 1、启动Jmeter&#xff1b; 2、“测试计划”中添加“线程组”&#xff1b; 3、“工作台”中添加“HTTP代理服务器”&#xff1b; 4、配置代理服务器&#xff1a;Global Settings下面的端口配置&#xff1a…

Redis 配置文件信息中文翻译版

前言 Redis 配置文件信息中文翻译版&#xff0c;方便大家阅读和理解对应参数信息及配置参数信息 # Redis configuration file example# Note on units: when memory size is needed, it is possible to specify # it in the usual form of 1k 5GB 4M and so forth: # 注意:当…

探索游戏公司跨部门合作的项目管理工具选择

为了实现出色的用户体验&#xff0c;游戏公司需要强大的研发能力和发行运营经验。通常情况下&#xff0c;游戏公司内部有多个独立工作的研发部门和发行部门&#xff0c;它们需要跨部门协作。随着公司快速发展和游戏项目增加&#xff0c;游戏公司迫切需要一套适用于特殊协作流程…

【Java 进阶篇】JQuery 案例:qq表情选择,表达情感的小黄脸

在我们的数字交流时代&#xff0c;表情符号已成为表达情感的重要方式之一。为了丰富用户的输入体验&#xff0c;qq表情选择功能应运而生。通过巧妙运用 JQuery&#xff0c;我们可以在页面中实现一个生动活泼的表情选择框&#xff0c;让用户轻松表达各种情感。本篇博客将深入探讨…

使用postman测试

第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a;添加请求 第四步&#xff1a;填写请求 代码实现自动关联的位置&#xff1a; 为相关联的接口设置环境&#xff1a; 使用设置的环境变量&#xff1a; 参数化实现测试&#xff1a;测试脚本中仅测试数据不一样&#xff…

6、使用本地模拟器调试项目

本地模拟器推荐内存为16G以上&#xff0c;最低内存要求8G&#xff08;比较卡顿&#xff09; 一、安装本地镜像 1、在开发工具的“文件”菜单中选择“设置” 2、在“设置”中选择“SDK”&#xff0c;在右侧勾选“System-image-phone”&#xff0c;点击“应用”开始安装 3、点击…

基于单片机的水位检测系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机的水位检测系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的水位检测系统仿真系统是一种用于模拟水位检测系统的工作过程&#xff0c;以验证设计方案的可行性和优…

TiDB单机集群模拟生产环境

1、先部署环境&#xff0c;安装5.4.3版本&#xff0c;详细的安装步骤见官方文档&#xff1a;单机集群模拟生产环境安装教程 配置文件topo.yaml global:user: "tidb"ssh_port: 22deploy_dir: "/tidb-deploy"data_dir: "/tidb-data"monitored:no…

科研学习|研究方法——Python计量Logit模型

一、离散选择模型 莎士比亚曾经说过&#xff1a;To be, or not to be, that is the question&#xff0c;这就是典型的离散选择模型。如果被解释变量时离散的&#xff0c;而非连续的&#xff0c;称为“离散选择模型”。例如&#xff0c;消费者在购买汽车的时候通常会比较几个不…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之进程管理1》(3)

《Linux操作系统原理分析《Linux操作系统原理分析之进程管理1》》&#xff08;3&#xff09; 3 进程管理3.1 基础3.1.1 进程执行3.1.2 进程定义3.1.3 进程特征3.1.4 利弊 3.2 进程状态和进程控制3.2.1 进程的状态和转换3.2.2 进程的实体 3.2.3 进程控制 3.3 进程状态和进程控制…

【电路笔记】-快速了解无源器件

快速了解无源器件 文章目录 快速了解无源器件1、概述2、电阻器作为无源器件3、电感器作为无源器件4、电容器作为无源器件5、总结 无源器件是电子电路的主要构建模块&#xff0c;没有它们&#xff0c;这些电路要么根本无法工作&#xff0c;要么变得不稳定。 1、概述 那么什么是…

从理论到实践:深度解读BIO、NIO、AIO的优缺点及使用场景

文章目录 BIO优缺点示例代码 NIO优缺点示例代码 AIO优缺点示例代码 总结 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 BIO、NIO和AIO是Java编程语言中用于处理输入输出&#xff08;IO…

M系列 Mac安装配置Homebrew

目录 首先&#xff0c;验证电脑是否安装了Homebrew 1、打开终端输入以下指令&#xff1a; 2、如图所示&#xff0c;该电脑没有安装Homebrew &#xff0c;下面我们安装Homebrew 一、官网下载 &#xff08;不建议&#xff09; 1、我们打开官网&#xff1a;https://brew.sh/ …

微信群BUG大揭秘!开启身份切换神器

前言 最近微信群里出现了一个神秘的BUG&#xff0c;普通群成员竟然可以艾特全体成员。今天&#xff0c;就让我们一起揭秘这个令人震惊的微信群普通成员可全体成员的BUG 复现步骤 复现步骤也很简单&#xff0c;前提条件就是要在PC客户端操作&#xff01;首先得有个属于自己的群…