Preface

这次CC难度较上两场升高了许多,后面两题都只能借着曲明姐姐和jz姐姐的仙气来做

值得一提的是原来的F大概需要大力分类讨论,结果我写了一大半题目就因为原题被ban了233

最后勉强涨了近200分,下场如果不出意外地话应该可以打到六星。(ORZ七星julao LTL)


A Chef and Maximum Star Value

SB题,可以设一个阈值统计也可以直接根号大暴力,反正都能过

  1. #include<cstdio>
  2. #include<iostream>
  3. #define RI register int
  4. using namespace std;
  5. const int N=100005;
  6. int t,n,x,ct[N*10],ans,mx;
  7. int main()
  8. {
  9. for (scanf("%d",&t);t;--t)
  10. {
  11. RI i,j; for (scanf("%d",&n),ans=mx=0,i=1;i<=n;++i)
  12. {
  13. scanf("%d",&x); ans=max(ans,ct[x]); mx=max(mx,x);
  14. for (j=1;j*j<=x;++j) if (x%j==0)
  15. {
  16. ++ct[j]; if (x!=j*j) ++ct[x/j];
  17. }
  18. }
  19. for (printf("%d\n",ans),i=1;i<=mx;++i) ct[i]=0;
  20. }
  21. }

B Array Modification

考虑一个数\(x\),与它对应位置的数记为\(y\),则\((x,y)\to (x\operatorname{xor}y,x)\to(y,x\operatorname{xor} y)\to (x,y)\)

意味着做\(3\times k\)次就会循环出现,然后膜一下再暴力跑即可

WARNING:注意\(n\)为奇数是最中间一个数做一次就变成\(0\)了

  1. #include<cstdio>
  2. #define RI register int
  3. using namespace std;
  4. const int N=10005;
  5. int t,n,a[N]; long long k;
  6. int main()
  7. {
  8. for (scanf("%d",&t);t;--t)
  9. {
  10. RI i; scanf("%d%lld",&n,&k);
  11. for (i=1;i<=n;++i) scanf("%d",&a[i]);
  12. if ((n&1)&&k>=(n+1>>1)) a[n+1>>1]=0; k%=3*n;
  13. for (i=1;k;--k,i=i!=n?i+1:1) a[i]^=a[n-i+1];
  14. for (i=1;i<=n;++i) printf("%d%c",a[i]," \n"[i==n]);
  15. }
  16. return 0;
  17. }

C Even Edges

分类讨论。首先\(m\)为偶数显然不需要分,直接输出\(1\)

如果\(m\)为奇数但是存在任意一个点度数为奇数那么直接把它单独拿出来即可,答案为\(2\)

如果没有奇数度数点怎么办,手动构造啊,先随便找一条边拿出其中的一个点,那么剩下的那个点的度数必然是奇数了,重复上面的方法因此答案为3

  1. #include<cstdio>
  2. #define RI register int
  3. using namespace std;
  4. const int N=100005;
  5. int t,n,m,deg[N],x,y;
  6. inline void clear(void)
  7. {
  8. for (RI i=1;i<=n;++i) deg[i]=0;
  9. }
  10. int main()
  11. {
  12. for (scanf("%d",&t);t;--t)
  13. {
  14. RI i; for (scanf("%d%d",&n,&m),i=1;i<=m;++i)
  15. scanf("%d%d",&x,&y),++deg[x],++deg[y];
  16. if (!(m&1))
  17. {
  18. for (puts("1"),i=1;i<=n;++i) printf("%d%c",1," \n"[i==n]);
  19. clear(); continue;
  20. }
  21. bool flag=0; for (i=1;i<=n;++i)
  22. if (deg[i]&1) { flag=1; x=i; break; }
  23. if (flag)
  24. {
  25. for (puts("2"),i=1;i<=n;++i) printf("%d%c",i==x?1:2," \n"[i==n]);
  26. clear(); continue;
  27. }
  28. for (puts("3"),i=1;i<=n;++i) printf("%d%c",i==x?1:(i==y?2:3)," \n"[i==n]); clear();
  29. }
  30. return 0;
  31. }

D Bacterial Reproduction

稍微要动下脑子的一题。注意到我们只需要对于节点的性质进行讨论即可:

  • 若该点为叶节点,那么从根到它的路径上所有能在规定时间之内到达它的(大于的区间)都可以对他都能造成贡献
  • 若该点不是叶节点,那么从根到它的路径上所有能在规定时间之时(单点)到达它的(大于的区间)都可以对他都能造成贡献

那么我们离线处理问题,DFS处理修改,可以用时间减去深度维护下标,用树状数组维护即可

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<vector>
  4. #define int long long
  5. #define RI register int
  6. #define CI const int&
  7. #define pb push_back
  8. #define mp make_pair
  9. using namespace std;
  10. typedef pair <int,int> pi;
  11. const int N=500005;
  12. struct edge
  13. {
  14. int to,nxt;
  15. }e[N<<1]; int n,q,head[N],cnt,x,y,ans[N],deg[N];
  16. vector <pi> ps[N]; vector <int> qs[N];
  17. inline char get(void)
  18. {
  19. char ch; while (isspace(ch=getchar())); return ch;
  20. }
  21. inline void addedge(CI x,CI y)
  22. {
  23. e[++cnt]=(edge){y,head[x]}; head[x]=cnt; ++deg[x];
  24. e[++cnt]=(edge){x,head[y]}; head[y]=cnt; ++deg[y];
  25. }
  26. class Tree_Array
  27. {
  28. private:
  29. int bit[N<<1];
  30. public:
  31. #define lowbit(x) x&-x
  32. inline void add(RI x,CI y)
  33. {
  34. for (x+=n+1;x<=n+q+1;x+=lowbit(x)) bit[x]+=y;
  35. }
  36. inline int get(RI x,int ret=0)
  37. {
  38. for (x+=n+1;x;x-=lowbit(x)) ret+=bit[x]; return ret;
  39. }
  40. #undef lowbit
  41. }BIT;
  42. #define to e[i].to
  43. inline void DFS(CI now=1,CI fa=0,CI dep=0)
  44. {
  45. for (vector <pi>::iterator it=ps[now].begin();it!=ps[now].end();++it)
  46. BIT.add(it->first-dep,it->second);
  47. for (vector <int>::iterator it=qs[now].begin();it!=qs[now].end();++it)
  48. if (deg[now]==1) ans[*it]=BIT.get(*it-dep);
  49. else ans[*it]=BIT.get(*it-dep)-BIT.get(*it-dep-1);
  50. for (RI i=head[now];i;i=e[i].nxt) if (to!=fa) DFS(to,now,dep+1);
  51. for (vector <pi>::iterator it=ps[now].begin();it!=ps[now].end();++it)
  52. BIT.add(it->first-dep,-it->second);
  53. }
  54. #undef to
  55. signed main()
  56. {
  57. RI i; for (scanf("%lld%lld",&n,&q),i=1;i<n;++i)
  58. scanf("%lld%lld",&x,&y),addedge(x,y);
  59. if (n==1) deg[1]=1; else deg[1]=0;
  60. for (i=1;i<=n;++i) scanf("%lld",&x),ps[i].pb(mp(0,x));
  61. for (i=1;i<=q;++i) if (get()=='?') scanf("%lld",&x),qs[x].pb(i);
  62. else scanf("%lld%lld",&x,&y),ps[x].pb(mp(i,y)),ans[i]=-1;
  63. for (DFS(),i=1;i<=q;++i) if (~ans[i]) printf("%lld\n",ans[i]);
  64. return 0;
  65. }

F Queries on Matrix

本来只会一个\(O(n^3\log Q)\)的暴力方法,主要就是分别考虑行和列的贡献(有多少个是奇数)

然后DP设\(f_{i,j}\)表示做了\(i\)次,有\(j\)行奇数的方案数,显然有转移\(f_{i,j}=f_{i-1,j-1}\times (n-j+1)+f_{i-1,j+1}\times(j+1)\),结合矩阵快速幂转移即可

正解么,生成函数大法好!(让我们一起来膜拜jz姐姐吧)

由于做法比较大力因此可能需要卡常,这里的代码把多项式中的系数为\(0\)的项省略了

  1. #include<cstdio>
  2. #include<vector>
  3. #include<iostream>
  4. #define RI register int
  5. #define CI const int&
  6. #define pb push_back
  7. using namespace std;
  8. typedef vector <int> VI;
  9. const int N=2005,mod=998244353,inv2=mod+1>>1;
  10. VI A,B,PB[N]; int r[N],c[N];
  11. // A: e^x-e^-x ; B: e^x+e^-x
  12. // use half space and ignore 0
  13. int t,n,m,z,pw[N],fact[N],inv[N],ipw2[N]; long long q;
  14. inline int quick_pow(int x,int p=mod-2,int mul=1)
  15. {
  16. for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
  17. }
  18. inline void inc(int& x,CI y)
  19. {
  20. if ((x+=y)>=mod) x-=mod;
  21. }
  22. inline void dec(int& x,CI y)
  23. {
  24. if ((x-=y)<0) x+=mod;
  25. }
  26. inline VI operator * (const VI& A,const VI& B)
  27. {
  28. CI na=A.size(),nb=B.size(); VI C(na+nb-1);
  29. for (RI i=0;i<na;++i) for (RI j=0;j<nb;++j)
  30. inc(C[i+j],1LL*A[i]*B[j]%mod); return C;
  31. }
  32. inline void Div(VI& A) // A/=(e^x+e^-x)
  33. {
  34. CI na=A.size(); VI C(na); RI i;
  35. for (i=na-1;~i;--i) if (A[i])
  36. {
  37. C[i]=A[i]; if (i) dec(A[i-1],A[i]);
  38. }
  39. bool flag=0; for (A.clear(),i=0;i<na;++i)
  40. {
  41. if (C[i]) flag=1; if (flag) A.pb(C[i]);
  42. }
  43. }
  44. inline void DEBUG(const VI& P)
  45. {
  46. int cp=P.size(); for (RI i=0;i<cp;++i) printf("%d ",P[i]); putchar('\n');
  47. }
  48. inline int init(CI n=2000)
  49. {
  50. RI i; for (fact[0]=i=1;i<=n;++i) fact[i]=1LL*fact[i-1]*i%mod;
  51. for (inv[n]=quick_pow(fact[n]),i=n-1;~i;--i) inv[i]=1LL*inv[i+1]*(i+1)%mod;
  52. for (ipw2[0]=i=1;i<=n;++i) ipw2[i]=1LL*ipw2[i-1]*inv2%mod;
  53. for (A.pb(mod-1),A.pb(1),B.pb(1),B.pb(1),PB[0].pb(1),i=1;i<=n;++i) PB[i]=PB[i-1]*B;
  54. }
  55. inline int C(CI n,CI m)
  56. {
  57. return 1LL*fact[n]*inv[m]%mod*inv[n-m]%mod;
  58. }
  59. inline int calc(const VI& A,CI c,int ret=0)
  60. {
  61. RI i,j; for (i=j=c;j>0;--i,j-=2) inc(ret,1LL*A[i]*pw[j]%mod);
  62. for (i=0,j=c;j>0;++i,j-=2) if (q&1) dec(ret,1LL*A[i]*pw[j]%mod);
  63. else inc(ret,1LL*A[i]*pw[j]%mod); return ret;
  64. }
  65. inline void solve(int *a,CI n)
  66. {
  67. VI P=PB[n]; RI i; int cp=P.size(); for (i=0;i<cp;++i) P[i]=1LL*P[i]*ipw2[n]%mod;
  68. for (a[0]=calc(P,n),i=1;i<=n;++i) P=P*A,Div(P),a[i]=1LL*calc(P,n)*C(n,i)%mod;
  69. }
  70. int main()
  71. {
  72. for (init(),scanf("%d",&t);t;--t)
  73. {
  74. RI i,j; int ans=0; scanf("%d%d%lld%d",&n,&m,&q,&z);
  75. for (pw[0]=i=1;i<=max(n,m);++i)
  76. pw[i]=quick_pow(i,q%(mod-1));
  77. for (solve(r,n),solve(c,m),i=0;i<=n;++i) for (j=0;j<=m;++j)
  78. if (i*(m-j)+j*(n-i)==z) inc(ans,1LL*r[i]*c[j]%mod);
  79. printf("%d\n",ans);
  80. }
  81. return 0;
  82. }

G Faulty System

论文题真有趣。直接看IOI2018中国国家候选队论文集里的拟阵部分即可

注意这里的拟阵定义就是里面的图拟阵,拟阵交的具体算法实现也都在里面了

  1. #include<cstdio>
  2. #include<cstring>
  3. #define RI register int
  4. #define CI const int&
  5. using namespace std;
  6. const int N=305;
  7. struct edge
  8. {
  9. int to,nxt;
  10. }e[N*N]; int t,n,m,head[N],cnt;
  11. struct Graph_Matroid
  12. {
  13. int x[N],y[N],fa[N];
  14. inline int getfa(CI x)
  15. {
  16. return x!=fa[x]?fa[x]=getfa(fa[x]):x;
  17. }
  18. inline void init(void)
  19. {
  20. for (RI i=1;i<=n;++i) fa[i]=i;
  21. }
  22. inline void Union(CI p)
  23. {
  24. fa[getfa(x[p])]=getfa(y[p]);
  25. }
  26. inline bool identify(CI p)
  27. {
  28. return getfa(x[p])==getfa(y[p]);
  29. }
  30. }A,B; int C[N],q[N],pre[N],tot; bool cs[N],st[N],tar[N],rch[N],vis[N];
  31. inline void addedge(CI x,CI y)
  32. {
  33. e[++cnt]=(edge){y,head[x]}; head[x]=cnt;
  34. }
  35. inline void DEBUG(bool *a)
  36. {
  37. for (RI i=1;i<=m;++i) printf("%d%c",a[i]," \n"[i==m]);
  38. }
  39. #define to e[i].to
  40. inline bool BFS(void)
  41. {
  42. RI H=0,T=0,i,now; memset(rch,0,m+1); memset(pre,0,m+1<<2);
  43. for (i=1;i<=m;++i) if (st[i]) q[++T]=i,rch[i]=1;
  44. while (H<T)
  45. {
  46. now=q[++H]; if (tar[now]) break;
  47. for (i=head[now];i;i=e[i].nxt) if (!rch[to])
  48. rch[to]=1,q[++T]=to,pre[to]=now;
  49. }
  50. if (!tar[now]) return 0; for (;now;now=pre[now]) vis[now]=1; return 1;
  51. }
  52. #undef to
  53. inline int Cross(void)
  54. {
  55. for (tot=0,memset(cs,0,m+1);;)
  56. {
  57. RI i,j; for (memset(head,0,m+1<<2),cnt=0,i=1;i<=tot;++i)
  58. {
  59. for (A.init(),B.init(),j=1;j<=tot;++j)
  60. if (i!=j) A.Union(C[j]),B.Union(C[j]);
  61. for (j=1;j<=m;++j) if (!cs[j])
  62. {
  63. if (!A.identify(j)) addedge(C[i],j);
  64. if (!B.identify(j)) addedge(j,C[i]);
  65. }
  66. }
  67. memset(st,0,m+1); memset(tar,0,m+1); memset(vis,0,m+1);
  68. for (A.init(),B.init(),i=1;i<=tot;++i) A.Union(C[i]),B.Union(C[i]);
  69. for (i=1;i<=m;++i) if (!cs[i]) st[i]=!A.identify(i),tar[i]=!B.identify(i);
  70. //DEBUG(st); DEBUG(tar); DEBUG(cs);
  71. if (!BFS()) break; for (tot=0,i=1;i<=m;++i) if (cs[i]^vis[i]) C[++tot]=i;
  72. for (memset(cs,0,m+1),i=1;i<=tot;++i) cs[C[i]]=1;
  73. }
  74. return tot;
  75. }
  76. int main()
  77. {
  78. //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
  79. for (scanf("%d",&t);t;--t)
  80. {
  81. RI i; for (scanf("%d%d",&n,&m),i=1;i<=m;++i)
  82. scanf("%d%d",&A.x[i],&A.y[i]); for (i=1;i<=m;++i)
  83. scanf("%d%d",&B.x[i],&B.y[i]); printf("%d\n",(n-1<<1)-Cross());
  84. }
  85. return 0;
  86. }

H (Challenge) Maximizing LIS

JB Challenge写了好久的退火TMD没分233

最后还是靠着乱打的点东西拿了\(0.004\)分的好成绩


Postscript

我实在是太弱了……

Codechef October Challenge 2019 Division 1的更多相关文章

  1. Codechef November Challenge 2019 Division 1

    Preface 这场CC好难的说,后面的都不会做QAQ 还因为不会三进制位运算卷积被曲明姐姐欺负了,我真是太菜了QAQ PS:最后还是狗上了六星的说,期待两(三)场之内可以上七星 Physical E ...

  2. Codechef September Challenge 2019 Division 2

    Preface 这确实应该是我打过的比较水的CC了(其实就打过两场) 但由于我太弱了打的都是Div2,所以会认为上一场更简单,其实上一场Div的数据结构是真的毒 好了废话不多说快速地讲一下 A Eas ...

  3. Codechef August Challenge 2019 Division 2

    Preface 老年菜鸡终于开始打CC了,由于他太弱了所以只能打Div2 因为台风的原因challenge并没有写,所以水了个Rank7 A Football SB模拟题不解释 #include< ...

  4. Codechef April Challenge 2019 Division 2

    Maximum Remaining 题意:给n个数,取出两个数$a_{i}$,$a_{j}$,求$a_{i}\% a_{j}$取模的最大值 直接排个序,第二大(严格的第二大)模第一大就是答案了. #i ...

  5. CodeChef November Challenge 2019 Division 1题解

    传送门 AFO前的最后一场CC了--好好打吧-- \(SIMGAM\) 偶数行的必定两人平分,所以只要抢奇数行中间那个就行了 这题怎么被爆破了 //quming #include<bits/st ...

  6. Codechef July Challenge 2019 Division 1题解

    题面 \(CIRMERGE\) 破环成链搞个裸的区间\(dp\)就行了 //quming #include<bits/stdc++.h> #define R register #defin ...

  7. CodeChef October Lunchtime 2019 Division 2

    HIT: Khaled in HIT 题目描述 Khaled 教练是 HIT(Hag Institute of Technology)一位名师.但是,他有一些困扰. 最近,Khaled 教练正在教一门 ...

  8. Codechef April Challenge 2019 游记

    Codechef April Challenge 2019 游记 Subtree Removal 题目大意: 一棵\(n(n\le10^5)\)个结点的有根树,每个结点有一个权值\(w_i(|w_i\ ...

  9. Codechef October Challenge 2018 游记

    Codechef October Challenge 2018 游记 CHSERVE - Chef and Serves 题目大意: 乒乓球比赛中,双方每累计得两分就会交换一次发球权. 不过,大厨和小 ...

随机推荐

  1. #r语言(二)笔记

    #r语言(二)笔记 #早复习 #概述:R是用于统计分析.绘图的语言和操作环境 #对象: #数据类型--统称为对象 #向量(vector):用于存储数值型.字符型或逻辑型数据的一维数组. #定义向量: ...

  2. Redis中的Scan命令的使用

    Redis中有一个经典的问题,在巨大的数据量的情况下,做类似于查找符合某种规则的Key的信息,这里就有两种方式,一是keys命令,简单粗暴,由于Redis单线程这一特性,keys命令是以阻塞的方式执行 ...

  3. DSP编程与调试总结

    (1)error: can't allocate .ebss, size 000c450d (page 1) in DXINTFRAM2 (avail: 00010000) error: errors ...

  4. MySQL数据库~~~~ 完整性约束

    1. not null 与 default not null : 不可空 default : 默认值 例: create table t1(id int not null default 2); 2. ...

  5. CountDownLatch(倒计时计数器)使用说明 --并发

    方法说明:   public void countDown()      递减锁存器的计数,如果计数到达零,则释放所有等待的线程.如果当前计数大于零,则将计数减少.如果新的计数为零,出于线程调度目的, ...

  6. PyCharm2019 激活

    文章末尾补充几个激活码:网上收集 一.破解补丁激活优点:永久期限 缺点:需要修改配置文件和下载破解文件 1.下载破解文件点击链接 链接: https://pan.baidu.com/s/1T405JC ...

  7. 剑指Offer-39.把数组排成最小的数(C++/Java)

    题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 分析: 将数组 ...

  8. 蓝牙spp协议分析

    基本概念 蓝牙串口是基于 SPP 协议(Serial Port Profile),能在蓝牙设备之间创建串口进行数据传输的一种设备. 蓝牙串口的目的是针对如何在两个不同设备(通信的两端)上的应用之间保证 ...

  9. 基于Casbin实现ABAC

    最近同事在研究Casbin的权限设计,我们主要是考虑使用ABAC基于属性的访问控制,Casbin给的示例不多,于是自己写了几个示例. 首先我们看看提到ABAC时,一般描述如下: ABAC被一些人称为是 ...

  10. oracle将时间加一天,加小时,加分,加秒

    前言 oracle 时间类型可以直接相加,但加的是天,以天为单位,我们了解了这个,加一天,一小时,一分,一秒就都简单了. 加一天 select to_date('2019-08-15 22:03:10 ...