隐藏页面特效

AtCoder Regular Contest 163

1|0Preface


补题,这场比赛的时候被拉去开科研组会了,所以就没现场打了

这两天军训在伤病连划水,白天可以好好想题目舒服的一批

这场D题确实很妙,需要一些竞赛图相关的知识才能想到转化,不过也算是学到一个重要trick了吧


2|0A - Divide String


显然只要考虑能否分成两个串即可,首先如果存在i[2,n]使得si>s1则直接以i为开头断开即可

否则对于所有si=s1的位置,暴力检验从这里分开是否合法即可

#include<cstdio> #include<iostream> #define RI register int #define CI const int& using namespace std; const int N=2005; int t,n; char s[N]; int main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); for (scanf("%d",&t);t;--t) { RI i,j; bool flag=0; scanf("%d%s",&n,s+1); for (i=2;i<=n&&!flag;++i) if (s[i]>s[1]) puts("Yes"),flag=1; if (flag) continue; for (i=2;i<=n&&!flag;++i) if (s[i]==s[1]) { int sign=0; for (j=1;j<=min(i-1,n-i+1);++j) if (s[j]!=s[i+j-1]) { sign=s[j]-s[i+j-1]; break; } if (sign<0||(sign==0&&i-1<n-i+1)) flag|=1; } puts(flag?"Yes":"No"); } return 0; }

3|0B - Favorite Game


首先我们肯定只对a1,a2修改是最优的,然后刚开始一眼想到二分答案,再感觉可以三分一下a1减少的次数

然后写了一发发现样例都过不去,遂赶紧发现是个丁真题

我们给a3an排序后,枚举所有长度为m的区间aiai+m1,考虑把a1,a2变成这个能涵盖区间所需的最小代价即可

#include<cstdio> #include<iostream> #include<algorithm> #define RI register int #define CI const int& using namespace std; const int N=200005; int n,m,a[N],ans=2e9; int main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); RI i; for (scanf("%d%d",&n,&m),i=1;i<=n;++i) scanf("%d",&a[i]); for (sort(a+3,a+n+1),i=3;i+m-1<=n;++i) ans=min(ans,max(0,a[1]-a[i])+max(0,a[i+m-1]-a[2])); return printf("%d",ans),0; }

4|0C - Harmonic Mean


有意思的构造题,首先不难想到用裂项公式来构造,因为1x(x+1)=1x1x+1,所以我们总有如下构造方案(在n3时):

1=11×2+12×3+13×4++1(n1)×n+1n

不难发现如果n不能表示成k(k+1)的形式的话就已经做完了,现在就是要考虑重复的情况

由于k(k+1)一定是偶数,那么如果n可以被这样表示那么n1就一定不能被这样表示,因此我们可以先用n1个数表示出12,然后再填一个12上去即可

举个例子对于n=6=2×3,按照上面的方法分解出就是1=12+16+112+120+130+16是不合法的

那么我们可以先处理n=5的情况,1=12+16+112+120+15,然后两边同乘上12得到12=14+112+124+140+110,最后再加上12就可以用6个数表示1

#include<cstdio> #include<iostream> #define RI register int #define CI const int& using namespace std; int t,n; int main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); for (scanf("%d",&t);t;--t) { if (scanf("%d",&n),n==1) { puts("Yes\n1"); continue; } if (n==2) { puts("No"); continue; } RI i; int t=0; for (i=1;i*(i+1)<=n;++i) if (n==i*(i+1)) t=i; if (!t) { for (puts("Yes"),i=1;i<n;++i) printf("%d ",i*(i+1)); printf("%d\n",n); continue; } for (puts("Yes"),printf("%d ",2),i=1;i<n-1;++i) printf("%d ",2*i*(i+1)); printf("%d\n",2*(n-1)); continue; } return 0; }

5|0D - Sum of SCC


首先有一个关于竞赛图的SCC的重要结论:

竞赛图强连通缩点后的DAG呈链状,前面的所有点向后面的所有点连边。

证明其实也很简单,利用归纳法逐一加入每个SCC即可,具体可以看这里

然后利用这点我们就可以把统计SCC数目转化为另一个问题了

设将图的点集V划分为A,B两个集合,且满足A中的所有点与B中的所有点的边的方向均为AB,则这种点集划分的方案数即为图的SCC个数加1

证明的话就考虑上面的结论,我们将缩点后的DAG链记为s1,s2,,sk,当i<j时,边的方向均为sisj

则对于t[0,k]A={s1,s2,,st}B={st+1,st+2,,sk}均为满足上述要求的划分方案,且不存在在这之外的方案了

因此我们只要统计上面的问题的答案即可,这个很容易通过DP算出

fi,j,k表示以及处理了前i个点,其中有j条边的方向是从小到大的,且集合A的大小为k的方案数

转移的话就考虑i+1号点放在集合A还是集合B即可:

  • 若放在集合A,枚举原来A集合中的边有t[0,k]条方向为从小到大,则fi,j,k×Cktfi+1,j+t,k+1
  • 若放在集合B,枚举原来B集合中的边有t[0,ik]条方向为从小到大,则fi,j,k×Ciktfi+1,j+k+t,k

最后答案就是(i=0nfn,m,i)Cn(n1)2m

#include<cstdio> #include<iostream> #define RI register int #define CI const int& using namespace std; const int N=35,mod=998244353; int n,m,C[N][N],f[N][N*N][N],ans; inline int sum(CI x,CI y) { return x+y>=mod?x+y-mod:x+y; } inline void inc(int& x,CI y) { if ((x+=y)>=mod) x-=mod; } inline int quick_pow(int x,int p=mod-2,int mul=1) { for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul; } int main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); RI i,j,k,t; for (scanf("%d%d",&n,&m),i=0;i<=n;++i) for (C[i][0]=j=1;j<=i;++j) C[i][j]=sum(C[i-1][j],C[i-1][j-1]); for (f[0][0][0]=1,i=0;i<n;++i) for (j=0;j<=m;++j) for (k=0;k<=i;++k) if (f[i][j][k]) { for (t=0;t<=k;++t) inc(f[i+1][j+t][k+1],1LL*f[i][j][k]*C[k][t]%mod); for (t=0;t<=i-k;++t) inc(f[i+1][j+k+t][k],1LL*f[i][j][k]*C[i-k][t]%mod); } for (ans=1,i=m+1;i<=n*(n-1)/2;++i) ans=1LL*ans*i%mod*quick_pow(i-m)%mod; for (ans=(mod-ans)%mod,i=0;i<=n;++i) inc(ans,f[n][m][i]); return printf("%d",ans),0; }

6|0Postscript


好题很多,慢慢补吧


__EOF__

本文作者hl666
本文链接https://www.cnblogs.com/cjjsb/p/17525474.html
关于博主:复活的ACM新生,目前爱好仅剩Gal/HBR/雀魂/单机/OSU
版权声明:转载请注明出处
声援博主:欢迎加QQ:2649020702来DD我
posted @   空気力学の詩  阅读(109)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2019-07-04 2019绍一集训
点击右上角即可分享
微信分享提示