A组题,所以把榜粘全了。

第6名,被卡在刚好正中间。

我最近干什么伤天害理的事了?(例如说没有在skyh去上厕所的时候捶他)

上来看T1,非常贴心出题人直接把递推式子给你了,然后就和斐波数的递推一样了。

套一个矩乘和CRT就完事。我很懵啊但是打完了调一调就过样例了。

然后保存。刚想交,这时候就死机了。

彻底死机了,啥都动不了。我也没暴力打表也没踹主机怎么就突然死机了???

然后就没有然后了。心态稍炸。无奈重启。

冷静了挺长一段时间后,虽说心情还是很烦躁,但是还是再码了一遍,打暴力,挂对拍。

稳住100分之后,心情还是很乱(可能也有要放假了的因素),T3送上一个网络流暴力

然后剪枝,细节打错了,50->10。后来也没上对拍。

没怎么看时间,但是好像还剩一点。T2一看到复杂度是$O(n^3)$或$O(n^4)$之类的感觉会很麻烦很难想。

然后就没有想出来那个最简单最傻逼的暴力。

其实全程都没有静下心来做题。而且对A组题貌似还是有点恐惧。

但是这次的A组题真的没有那么难。三道题其实都可做(毕竟都有A的,呃,算上yxm数组开小的T3的话)

不要高估题目难度。不要怕题目,怕就一定输了。

要稳下心来做题,尽量避免外界因素的干扰。

要冷静应对一切可能发生的突发情况。

尽量及时地交代码,尽量频繁地存代码。

要攒RP防止天遣。。。

T1:贝尔数

可以发现第二个式子和斐波数的递推类似。而数据范围需要log掉那个n。

转移周期是质数大小的级别,而模数刚好是5个不大于50的数的乘积。

然后矩阵快速幂即可。只不过最后一项的转移稍微复杂了一点要特殊处理一下。

现场YY出CRT已经是常态了。

  1. #include<cstdio>
  2. #define Mod 95041567
  3. const int mod[]={,,,,,};
  4. int Ans[],base[][],ans[],n,t,C[][][],b[][],res[][];
  5. void ex_gcd(int a,int b,int &x,int &y){
  6. if(!b){x=;y=;return;}
  7. ex_gcd(b,a%b,x,y);
  8. int r=x;x=y;y=r-a/b*y;
  9. }
  10. int CRT(){int Cans=,x,y;
  11. for(int p=;p<=;++p){
  12. ex_gcd(Mod/mod[p],mod[p],x,y);x=x%Mod+Mod;
  13. Cans=(Cans+1ll*x*Ans[p]%Mod*(Mod/mod[p]))%Mod;
  14. }
  15. return Cans;
  16. }
  17. void mult_base(int mo){
  18. for(int i=;i<=mo;++i)for(int j=;j<=mo;++j)for(int k=;k<=mo;++k)res[i][j]+=base[i][k]*base[k][j];
  19. for(int i=;i<=mo;++i)for(int j=;j<=mo;++j)base[i][j]=res[i][j]%mo,res[i][j]=;
  20. }
  21. void mult_ans(int mo){
  22. for(int i=;i<=mo;++i)for(int j=;j<=mo;++j)res[][j]+=ans[i]*base[i][j];
  23. for(int i=;i<=mo;++i)ans[i]=res[][i]%mo,res[][i]=;
  24. }
  25. int main(){//freopen("t1.in","r",stdin);freopen("t1.out","w",stdout);
  26. #define mo mod[p]
  27. for(int p=;p<=;++p){
  28. for(int i=;i<=;++i)C[p][i][]=;
  29. for(int i=;i<=;++i)for(int j=;j<=i;++j)C[p][i][j]=(C[p][i-][j-]+C[p][i-][j])%mo;
  30. b[p][]=;
  31. for(int i=;i<=;++i)for(int j=;j<i;++j)b[p][i]=(b[p][i]+b[p][j]*C[p][i-][j])%mo;
  32. }scanf("%d",&t);
  33. while(t--){scanf("%d",&n);
  34. for(int p=;p<=;++p){
  35. for(int i=;i<=mo;++i)ans[i]=b[p][i];
  36. for(int i=;i<=mo;++i)for(int j=;j<=mo;++j)base[i][j]=;
  37. for(int i=;i<=mo;++i)base[i][i]=base[i][i-]=;
  38. base[][mo]=base[][mo]=;
  39. int t=(n-)/mo;
  40. for(;t;t>>=,mult_base(mo))if(t&)mult_ans(mo);
  41. Ans[p]=ans[(n-)%mo+];
  42. }
  43. printf("%d\n",CRT());
  44. }
  45. }

T2:穿越广场

dp[i][j][k][l]表示已经走了i步,有j个‘D’,和第一个串匹配到k长度,和第二个串匹配到l长度。

KMP一下找到如果匹配失败的话会怎么转移。然后50分的暴力就出来了。

%%%猿小鲲打了5.2k得了10分。

然而其实两个串分别匹配是没有意义的,和AC自动机专题的DP就很像了。

dp[i][j][k][l]表示i已经走了i步并且用了j个‘D’,目前匹配到AC自动机上的第k个节点,目前和两个串是否已经匹配完成过(0/1/2/3二进制压状态)

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. #define mst(p) memset(p,0,sizeof p)
  5. int mod(int p){return p>=?p-:p;}
  6. int trie[][],rt,cnt,q[],fail[],suc[],dp[][][][],ans;char s[];
  7. void build(int &p,int al,int ord){
  8. if(!p)p=++cnt;
  9. if(!s[al]){suc[p]|=ord;return;}
  10. build(trie[p][s[al]=='D'],al+,ord);
  11. }
  12. void bfs(){
  13. q[]=;trie[][]=trie[][]=rt;
  14. for(int qh=,qt=;qh<=qt;++qh)for(int i=;i<=;++i)
  15. if(trie[q[qh]][i])fail[q[++qt]=trie[q[qh]][i]]=trie[fail[q[qh]]][i];
  16. else trie[q[qh]][i]=trie[fail[q[qh]]][i];
  17. }
  18. int main(){
  19. int t;scanf("%d",&t);
  20. while(t--){
  21. int n,m;scanf("%d%d%s",&m,&n,s);build(rt,,);scanf("%s",s);build(rt,,);
  22. bfs();
  23. for(int i=;i<=cnt;++i)for(int j=i;j;j=fail[j])suc[i]|=suc[j];
  24. dp[][][rt][]=;
  25. for(int i=;i<n+m;++i)for(int j=;j<=n;++j)for(int k=;k<=cnt;++k)for(int l=;l<=;++l){
  26. dp[i+][j+][trie[k][]][l|suc[trie[k][]]]=mod(dp[i+][j+][trie[k][]][l|suc[trie[k][]]]+dp[i][j][k][l]);
  27. dp[i+][j][trie[k][]][l|suc[trie[k][]]]=mod(dp[i+][j][trie[k][]][l|suc[trie[k][]]]+dp[i][j][k][l]);
  28. }
  29. for(int k=;k<=cnt;++k)ans=mod(ans+dp[n+m][n][k][]);printf("%d\n",ans);
  30. rt=cnt=ans=;mst(dp);mst(fail);mst(suc);mst(trie);
  31. }
  32. }

T3:舞动的夜晚

这可能才是真正的A组难度吧。。。我感觉前两题好像的确是联赛知识点联赛难度。。。

暴力强制某个边必选,跑t次二分图匹配看能否达到最大流即可,能拿到50分。

而我不会匈牙利算法,我还是打的网络流来做二分图匹配。

那么继续想,网络流的特点在于可以退流。

那么在最大流的图上,通过退流,可以得到其它任意一种合法的最大匹配方案。

已经被用掉流量的边当然是合法的。

然后我们把图里的所有用到的边反向,这就相当于退流了。

退流之后如果能再次流满,那么新的决策上的边就和你建的反向边成环了。

所以在新的图上tarjan找强联通分量。如果一条边的两个端点在同一个强联通分量里,那么它就存在于某一种退流方式里。

所以不合法的边就是不存在于最开始的最大流里,而在tarjan中两端点也不属于同一个scc。

%%%yxs考场上就会做。

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. int n,m,t,ans[],x[],y[],fir[],l[],to[],w[],cnt=;
  5. int q[],dep[],bel[],dfn[],low[],tim,sta[],top,ins[],scc;
  6. int match[],tot;
  7. void link(int a,int b,int v=){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;w[cnt]=v;}
  8. bool bfs(){
  9. dep[]=;for(int i=;i<=n+m+;++i)dep[i]=;
  10. for(int qh=,qt=;qh<=qt;++qh)for(int i=fir[q[qh]];i;i=l[i])if(w[i]&&!dep[to[i]])dep[to[i]]=dep[q[qh]]+,q[++qt]=to[i];
  11. return dep[n+m+]>;
  12. }
  13. int dfs(int p,int flow){int res=flow;
  14. if(p==n+m+)return flow;
  15. for(int i=fir[p];i;i=l[i])if(dep[to[i]]==dep[p]+&&flow&&w[i]){
  16. int r=dfs(to[i],);
  17. if(!r)dep[to[i]]=;
  18. flow-=r;w[i]-=r;w[i^]+=r;
  19. }return res-flow;
  20. }
  21. void tarjan(int p,int fa){
  22. sta[++top]=p;dfn[p]=low[p]=++tim;ins[p]=;
  23. for(int i=fir[p];i;i=l[i])if(!dfn[to[i]])tarjan(to[i],p),low[p]=min(low[p],low[to[i]]);
  24. else if(ins[to[i]])low[p]=min(low[p],dfn[to[i]]);
  25. if(dfn[p]==low[p]){
  26. scc++;
  27. do{bel[sta[top]]=scc;ins[sta[top--]]=;}while(sta[top+]!=p);
  28. }
  29. }
  30. int main(){
  31. scanf("%d%d%d",&n,&m,&t);
  32. for(int i=;i<=t;++i)scanf("%d%d",&x[i],&y[i]),link(x[i],y[i]+n,),link(y[i]+n,x[i],);
  33. for(int i=;i<=n;++i)link(,i,),link(i,,);
  34. for(int i=;i<=m;++i)link(i+n,n+m+,),link(n+m+,i+n,);
  35. int max_flow=;
  36. while(bfs())max_flow+=dfs(,);
  37. for(int i=;i<=t;++i)if(!w[i<<])ans[i]=;
  38. for(int i=;i<=n;++i)if(!w[t+i<<])match[i]=;
  39. for(int i=;i<=m;++i)if(!w[t+n+i<<])match[n+i]=;
  40. for(int i=;i<=n+m+;++i)fir[i]=;cnt=;
  41. for(int i=;i<=t;++i)if(ans[i])link(y[i]+n,x[i]);else link(x[i],y[i]+n);
  42. for(int i=;i<=n;++i)if(match[i])link(i,);else link(,i);
  43. for(int i=;i<=m;++i)if(match[i+n])link(n+m+,i+n);else link(n+i,n+m+);
  44. for(int i=;i<=n+m+;++i)if(!dfn[i])tarjan(i,);
  45. for(int i=;i<=t;++i)if(bel[x[i]]==bel[y[i]+n])ans[i]=;
  46. for(int i=;i<=t;++i)tot+=ans[i]^;printf("%d\n",tot);
  47. for(int i=;i<=t;++i)if(!ans[i])printf("%d ",i);puts("");
  48. }

思路积累:

  • 考虑退流的实际意义

[考试反思]1019csp-s模拟测试80(a):天遣的更多相关文章

  1. [考试反思]0718 NOIP模拟测试5

    最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...

  2. csp-s模拟测试80(b)

    csp-s模拟测试80(b) 水题没什么可写的. $T1SB$规律题正解调了仨小时就过了. $T2SBDp$题颓完题解就秒了. $T3SB$数据结构考场想到正解就弃了,考后太懒一半正解一发随机化就A了 ...

  3. [考试反思]0909csp-s模拟测试41:反典

    说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...

  4. [考试反思]0814NOIP模拟测试21

    前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...

  5. [考试反思]0714/0716,NOIP模拟测试3/4

    这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...

  6. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  7. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

  8. [考试反思]1003csp-s模拟测试58:沉淀

    稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...

  9. [考试反思]0816NOIP模拟测试23

    210 210 210 170 还可以.暴力打满就rk4了? 但不管怎么说,总算是在改完题之后理直气壮的写考试反思了. T1是个dp,说水也不太水.(当然某脸只要A掉了一道题就要说那是水题) 我的思路 ...

随机推荐

  1. 文件操作——RandomAccessFile

      文件操作——RandomAccessFile 构建RandomAccessFileJava提供了一个可以对文件随机访问的操作,访问包括读和写操作.该类名为RandomAccessFile.该类的读 ...

  2. hadoop之yarn详解(框架进阶篇)

    前面在hadoop之yarn详解(基础架构篇)这篇文章提到了yarn的重要组件有ResourceManager,NodeManager,ApplicationMaster等,以及yarn调度作业的运行 ...

  3. MongoDB 学习笔记之 MongoDB导入导出

    MongoDB数据导入导出: mongoexport: -host 机器 -port 端口 -u 用户名 -p 密码 -d 库名 -c 表名 -f 列名 -o 导出的文件名 -q 查询条件 --csv ...

  4. Pycharm 快捷键大全 2019.2.3

    在Pycharm中打开Help->Keymap Reference可查看默认快捷键帮助文档,文档为PDF格式,位于安装路径的help文件夹中,包含MAC操作系统适用的帮助文档. 下图为2019. ...

  5. 即学即用的 30 段 Python 实用代码

    [☞ 分享:最全最新的Python学习大礼包 ☜ 点击查看](https://mp.weixin.qq.com/s?__biz=MzU2MzgyODA4OA==&mid=100000592&a ...

  6. UVA - 1160 X-Plosives

    A secret service developed a new kind of explosive that attain its volatile property only when a spe ...

  7. VM虚拟机启动夜神模拟器卡99%解决办法

    VM虚拟机启动夜神模拟器卡99%解决办法 本人出现的情况: 物理机装的是win7系统,安装了vmware14(安装过程未出现报错),在vmware14 上 win10系统(安装过程未出现报错),安装夜 ...

  8. 《java编程思想》P160-P180(第八章部分+第九章部分)

    1.什么是多态? 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 现实中,关于多态的例子不胜枚举.比方说按下 F1 ...

  9. Linux之shell基础

    Shell基础 一.shell概述 1) shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序 ...

  10. Python_MySQL数据库的写入与读取

    [需求]1. 在数据库中创建表,且能按时间自动创建新表 2. 数据写入数据库 3. 从数据库读取数据 1. 创建表,并自动更新 def Creat_Table(InitMySQL,tabel_name ...