AC修炼计划(AtCoder Regular Contest 162)

news2024/9/21 2:33:31

传送门: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();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【解决方案】危化品厂区安防系统EasyCVR+AI智能监控

危化品属于危险、易燃易爆、易中毒行类&#xff0c;一旦在生产运输过程中发生泄漏后果不堪想象&#xff0c;所以危化品的生产储存更需要严密、精细的监控&#xff0c;来保障危化品的安全。EasyCVRTSINGSEE青犀AI智能分析网关搭建的危化品智能监控方案就能很好的为危化品监管保驾…

基于ssm流浪动物救助管理系统

基于ssm流浪动物救助管理系统 摘要 随着城市化的不断发展&#xff0c;流浪动物问题逐渐凸显&#xff0c;而对流浪动物的救助和管理成为社会关注的焦点。本文基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架&#xff0c;设计并实现了一套流浪动物救助管理系统。该系…

碾压Fast Request!IDEA插件推荐:Apipost-Helper

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具&#xff0c;而今天给大家介绍一款IDEA插件&…

海外网红营销:品牌建设与获利的平衡策略

随着互联网的迅速发展&#xff0c;社交媒体已经成为了全球范围内广告和市场营销的主要平台。其中&#xff0c;海外网红营销已经成为一种备受关注的趋势&#xff0c;吸引了众多品牌的目光。然而&#xff0c;在这个充满竞争的数字世界里&#xff0c;品牌建设与获利之间的关系一直…

最长上升子序列模型 笔记

首先附上模板&#xff1a; #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long long ll;const int N 100010;int n; int a[N], q[N];int main()…

TypeError: Cannot read properties of undefined (reading ‘0‘)

1、在使用<el-dropdown>会报这个错误 原因&#xff1a;使用v-if控制显隐&#xff0c;找不到该节点就会开始报错 解决&#xff1a;使用v-show就可以了

Mac M3 芯片安装 Nginx

Mac M3 芯片安装 Nginx 一、使用 brew 安装 未安装 brew 的可以参考 【Mac 安装 Homebrew】 或者 【Mac M2/M3 芯片环境配置以及常用软件安装-前端】 二、查看 nginx 信息 通过命令行查看 brew info nginx可以看到 nginx 还未在本地安装&#xff0c;显示 Not installed …

零一万物回应「抄袭 LLaMA」;京东原副总裁试用可穿戴人工喉丨 RTE 开发者日报 Vol.85

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Java聚合对外网关,使用国密SM4采用CBC分组填充模式实现数据加密工具类,Jmeter压测

添加依赖配置 <!-- 仓库地址: https://mvnrepository.com/artifact/commons-codec/commons-codec --><!-- org.apache.commons.codec.binary.Base64 --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artif…

Python爬虫的七个常用技巧总结,这些你一定得知道!

文章目录 前言1、基本抓取网页2、使用代理IP3、Cookies处理4、伪装成浏览器5、验证码的处理6、gzip压缩7、多线程并发抓取关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战…

5+单基因+免疫浸润,这篇肿瘤预后文章你值得拥有

今天给同学们分享一篇生信文章“Systematic analysis of the role of SLC52A2 in multiple human cancers”&#xff0c;这篇文章发表在Cancer Cell Int期刊上&#xff0c;影响因子为5.8。 结果解读&#xff1a; 多种人类癌症中SLC52A2的mRNA表达 首先&#xff0c;作者使用GT…

Linux设备树(DTS)介绍

Dts&#xff1a;DTS即Device Tree Source&#xff0c;是一个文本形式的文件&#xff0c;用于描述硬件信息。一般都是固定信息&#xff0c;无法变更&#xff0c;无法overlay。 设备树由来 linux内核源码中&#xff0c;之前充斥着大量的平台相关&#xff08;platform Device&…

Windows系统CMake+VS编译protobuf

目录 一些名词CMake构建VS工程下载protobuf源码下载CMake编译QT中使用 方案二失败&#xff1a;CMakeQT自带的Mingw编译参考链接 一些名词 lib dll lib库实际上分为两种&#xff0c;一种是静态链接lib库或者叫做静态lib库&#xff0c;另一种叫做动态链接库dll库的lib导入库或称…

为什么程序员一定要写单元测试?

大家好&#xff0c;我是鱼皮&#xff0c;很多初学编程的同学都会认为 “程序员的工作只有开发新功能&#xff0c;功能做完了就完事儿”。但其实不然&#xff0c;保证程序的正常运行、提高程序的稳定性和质量也是程序员的核心工作。 之前给大家分享过企业项目的完整开发流程&am…

【numpy】数据类型

1、Numpy Python 的扩展库&#xff08;数学函数库&#xff09;&#xff0c;主要用于数组计算。 N维数组对象ndarray广播功能函数整合C/C/Fortran代码的工具线性代数、傅里叶变换、随机数生成等功能 通常与SciPy&#xff08;开源算法库和数学工具包&#xff09;和Matplotlib&a…

action3录制出来的LRF文件的正确打开方式

你会发现使用大疆的产品录制出来的视频会有两种格式&#xff1a;LRF和MP4 这个LRF文件是低分辨率、低码率的预览文件&#xff0c;非常适合预览。 这个文件可以直接通过修改文件后缀转化为.mp4格式

STM32速成笔记—SPI通信

&#x1f380; 文章作者&#xff1a;二土电子 &#x1f338; 关注公众号获取更多资料&#xff01; &#x1f438; 期待大家一起学习交流&#xff01; 文章目录 一、SPI简介二、SPI的四种工作方式三、STM32的SPI通信3.1 SPI内部结构分析3.2 SPI引脚 四、SPI通信程序设计4.1 S…

RSS订阅快速连接Notion

数环通让您可以通过不到几分钟的时间即可实现RSS订阅与Notion的对接与集成&#xff0c;从而高效实现工作流程自动化&#xff0c;降本增效&#xff01; 1.产品介绍 RSS订阅是数环通的内置应用&#xff0c;很多用户通过RSS订阅来收集自己在各大平台上看的内容&#xff0c;当RSS…

清晨早安问候祝福语精选,相互牵挂,祝福无价!

1、有一种祝福&#xff0c;时刻都在心里。无论相隔多远&#xff0c;都能温暖彼此的心灵。珍惜美丽相遇&#xff0c;珍藏这份情意。忙碌不是忘记&#xff0c;牵挂一直都在心里。送上一份心的祝福&#xff0c;书写一份心的牵挂&#xff0c;坦诚相待&#xff0c;温暖相伴&#xff…

XXX系统测试报告测试用例模板

XXX系统测试报告 编制&#xff1a; 2023-5-16 审核&#xff1a; 日期&#xff1a; 批准&#xff1a; 日期&#xff1a; 版本 修订时间 修订人 修订类型 修订章节 修订内容 *修订类型分为 A …