[关闭]
@xiaoziyao 2021-05-13T21:30:02.000000Z 字数 19948 阅读 1299

HNOI2021游记

考试总结


HNOI2021联合省选,A卷。

前言

由于本菜鸡在NOIP2020考出了的分数(虽然比很多人成绩低了不知道多少),在HN有一个好看的名次,所以格外看重这次把NOIP作为的联合省选,结果省选因为个人原因也没有太好看的分数,还是有一些遗憾的。。。

为什么省选不考字符串、数论和分块啊!!!

AFO了,希望中考大捷,也希望各位在OI这条路上可以走得更远!

4月10日 Day 1

机房,和同学都分开了,有一种不祥的预感。

带了一大袋零食去考试,在考前写了个manacher与广义SAM练手,手感挺好。

一遍输对密码,有了一个好的开始!

T1:诶,这道题怎么和我之前做的一道题很像呀,要反悔贪心吗?

首先胡了一个找差值的贪心上去,然后样例都没过,原因是最大值可以变成最小值,所以构造了一组比较强的数据:

  1. 5 5
  2. 11 13 15 17 9
  3. 1 2 3 4 5

想了一下反悔贪心没有想到。

突然发现最终的答案一定会形成一个区间,而且区间长度最小,因此直接想到排序+尺取法,5min rush完了代码,再调了调细节,一遍过大样例。

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #define inf 1000000001
  4. using namespace std;
  5. const int maxn=1000005;
  6. int n,m,ans;
  7. int a[maxn],b[maxn],vis[maxn];
  8. pair<int,int>c[maxn<<1];
  9. inline int get(int x){
  10. return x>n? x-n:x;
  11. }
  12. int main(){
  13. freopen("card.in","r",stdin);
  14. freopen("card.out","w",stdout);
  15. scanf("%d%d",&n,&m);
  16. for(int i=1;i<=n;i++)
  17. scanf("%d",&a[i]),c[i].first=a[i],c[i].second=i;
  18. for(int i=1;i<=n;i++)
  19. scanf("%d",&b[i]),c[n+i].first=b[i],c[n+i].second=n+i;
  20. sort(c+1,c+1+2*n);
  21. int l=1,r=0,cnta=0,cnt=0;
  22. while(cnt<n||cnta<n-m){
  23. r++;
  24. if(c[r].second<=n)
  25. cnta++;
  26. if(vis[get(c[r].second)]==0)
  27. cnt++;
  28. vis[get(c[r].second)]++;
  29. }
  30. ans=c[r].first-c[l].first;
  31. while(l<2*n&&r<=2*n){
  32. if(c[l].second<=n)
  33. cnta--;
  34. vis[get(c[l].second)]--;
  35. if(vis[get(c[l].second)]==0)
  36. cnt--;
  37. l++;
  38. while(cnt<n||(r<=2*n&&cnta<n-m)){
  39. r++;
  40. if(c[r].second<=n)
  41. cnta++;
  42. if(vis[get(c[r].second)]==0)
  43. cnt++;
  44. vis[get(c[r].second)]++;
  45. }
  46. if(r>2*n)
  47. break;
  48. ans=min(ans,c[r].first-c[l].first);
  49. }
  50. printf("%d\n",ans);
  51. return 0;
  52. }

花30min写了个指数级暴力,然后还写了个拍子拍上了,然后去厕所(

拍了几千组数据出了问题,发现是数据生成器写错了,改了一下就继续拍下去了。(最后拍了一两万组的数据)

T2:看了好久,感觉和做过的另一道题很像,然后发现并不可以这样做。

想了想差分之类能不能构造出一些特殊的地方,然后发现并不能。

然后想了一下高斯消元,发现是,想了想能不能带状高斯消元优化,发现并不会写带状高斯消元,然后就放弃了。

想了想差分约束,发现加法不好做差分约束,想到了直接给某些数带上负号,也就是直接黑白染色黑色为正白色为负,然后坐了坐感觉要把黑色和白色放在一起,又rush了好久发现不能构建一个含有个未知量的不等式约束,然后就没想下去了。

考后补充:实际上可以直接把式子列出来,对一个整体进行差分约束,然后就做完了。

发现第一档部分分不会做,然后果断写第二档部分分。

第二档部分分想了好久,发现很简单:设第一行为,那么之后每一行都可以表示出来,然后可以约束取值范围,随便选一个数就好了。

第三档部分分想到了2-SAT:rush了一个2-SAT然后发现似乎不能约束某些的方格至少有,然后就注释掉了。

考后juju说只需要建虚点就可以了。(我果然是图论废物)

  1. #include<stdio.h>
  2. #include<vector>
  3. #define inf 10100000000
  4. using namespace std;
  5. const int maxn=305,maxt=maxn*maxn*2;
  6. int T,n,m,e,ff,fff,ffff;
  7. int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];
  8. //int scc,all,top;
  9. //int stk[maxt],vis[maxt],bel[maxt],p[4];
  10. //vector<int>v[maxt],rv[maxt];
  11. inline int getpos(int x,int y){
  12. return (x-1)*m+y;
  13. }
  14. /*inline void add(int x,int y){
  15. printf("ADD(%d,%d)\n",x,y);
  16. v[x].push_back(y),rv[y].push_back(x);
  17. }
  18. void dfs(int x){
  19. vis[x]=1;
  20. for(int i=0;i<v[x].size();i++)
  21. if(vis[v[x][i]]==0)
  22. dfs(v[x][i]);
  23. stk[++top]=x;
  24. }
  25. void rdfs(int x,int c){
  26. vis[x]=1,bel[x]=c;
  27. for(int i=0;i<rv[x].size();i++)
  28. if(vis[rv[x][i]]==0)
  29. rdfs(rv[x][i],c);
  30. }*/
  31. void dfs(int x,int y){
  32. if(x==1){
  33. if(y>n)
  34. x++,y=1;
  35. else{
  36. for(int i=0;i<=b[x][y]&&(y==1||i<=b[x][y-1]);i++){
  37. a[x][y]=i;
  38. dfs(x,y+1);
  39. if(ff)
  40. return ;
  41. }
  42. }
  43. }
  44. if(y==1){
  45. if(x>n){
  46. int F=0;
  47. for(int i=2;i<=n;i++)
  48. for(int j=2;j<=m;j++){
  49. a[i][j]=b[i-1][j-1]-a[i-1][j-1]-a[i][j-1]-a[i-1][j];
  50. if(a[i][j]<0||a[i][j]>1000000){
  51. F=1;
  52. break;
  53. }
  54. }
  55. if(F==0)
  56. ff=1;
  57. return ;
  58. }
  59. for(int i=0;i<=b[x][y]&&i<=b[x-1][y];i++){
  60. a[x][y]=i;
  61. dfs(x+1,y);
  62. if(ff)
  63. return ;
  64. }
  65. }
  66. }
  67. int main(){
  68. freopen("matrix.in","r",stdin);
  69. freopen("matrix.out","w",stdout);
  70. scanf("%d",&T);
  71. while(T--){
  72. int flg01=1,flag=0;
  73. ff=fff=ffff=0;
  74. scanf("%d%d",&n,&m);
  75. for(int i=1;i<n;i++)
  76. for(int j=1;j<m;j++){
  77. scanf("%d",&b[i][j]);
  78. flg01|=(b[i][j]==0||b[i][j]==1);
  79. fff|=(b[i][j]==0);
  80. ffff|=(b[i][j]==4000000);
  81. }
  82. if(fff){
  83. puts("YES");
  84. for(int i=1;i<=n;i++)
  85. for(int j=1;j<=m;j++)
  86. printf("0%c",j==m? '\n':' ');
  87. continue;
  88. }
  89. if(ffff){
  90. puts("YES");
  91. for(int i=1;i<=n;i++)
  92. for(int j=1;j<=m;j++)
  93. printf("1000000%c",j==m? '\n':' ');
  94. continue;
  95. }
  96. if(n==2){
  97. for(int i=1;i<m;i++)
  98. for(int j=1;j<n;j++)
  99. c[i][j]=b[j][i];
  100. for(int i=1;i<m;i++)
  101. for(int j=1;j<n;j++)
  102. b[i][j]=c[i][j];
  103. swap(n,m),flag=1;
  104. }
  105. if(m==2){
  106. int lst=0,minn=0,maxx=2000000;
  107. for(int i=1;i<n;i++){
  108. if(i&1){
  109. minn=max(minn,b[i][1]-lst-2000000);
  110. maxx=min(maxx,b[i][1]-lst);
  111. lst=b[i][1]-lst;
  112. // 0<=b[i][1]-lst-x<=2e6
  113. }
  114. else{
  115. minn=max(minn,lst-b[i][1]);
  116. maxx=min(maxx,lst-b[i][1]+2000000);
  117. lst=b[i][1]-lst;
  118. // 0<=b[i][1]-lst+x<=2e6
  119. }
  120. }
  121. if(minn>maxx){
  122. puts("NO");
  123. continue;
  124. }
  125. lst=minn;
  126. a[1][1]=lst/2,a[1][2]=lst-lst/2;
  127. for(int i=1;i<n;i++){
  128. lst=b[i][1]-lst;
  129. a[i+1][1]=lst/2,a[i+1][2]=lst-lst/2;
  130. }
  131. }
  132. else{
  133. dfs(1,1);
  134. if(ff==0){
  135. puts("NO");
  136. continue;
  137. }
  138. }
  139. /* if(flg01){
  140. int flg=0;
  141. for(int i=1;i<n;i++)
  142. for(int j=1;j<m;j++){
  143. p[0]=getpos(i,j),p[1]=getpos(i+1,j);
  144. p[2]=getpos(i,j+1),p[3]=getpos(i+1,j+1);
  145. if(b[i][j]==0)
  146. for(int k=0;k<=3;k++)
  147. add(p[k]+n*m,p[k]);
  148. else for(int k=0;k<=3;k++)
  149. for(int c=0;c<=3;c++)
  150. if(k!=c)
  151. add(p[k]+n*m,p[c]);
  152. }
  153. all=2*n*m;
  154. for(int i=1;i<=all;i++)
  155. if(vis[i]==0)
  156. dfs(i);
  157. for(int i=1;i<=all;i++)
  158. vis[i]=0;
  159. for(int i=all;i>=1;i--)
  160. if(vis[stk[i]]==0)
  161. rdfs(stk[i],++scc);
  162. for(int i=1;i<=n*m;i++)
  163. if(bel[i]==bel[n*m+i]){
  164. flg=1;
  165. break;
  166. }
  167. if(flg){
  168. puts("NO");
  169. continue;
  170. }
  171. puts("YES");
  172. for(int i=1;i<=n*m;i++)
  173. printf("%d%c",(bel[i]<bel[n*m+i]),i%m==0? '\n':' ');
  174. for(int i=1;i<=all;i++)
  175. vis[i]=bel[i]=0,v[i].clear();
  176. scc=e=top=0;
  177. continue;
  178. }*/
  179. if(flag){
  180. for(int i=1;i<=n;i++)
  181. for(int j=1;j<=m;j++)
  182. c[j][i]=a[i][j];
  183. for(int i=1;i<=m;i++)
  184. for(int j=1;j<=n;j++)
  185. a[i][j]=c[i][j];
  186. swap(n,m);
  187. }
  188. puts("YES");
  189. for(int i=1;i<=n;i++)
  190. for(int j=1;j<=m;j++)
  191. printf("%d%c",a[i][j],j==m? '\n':' ');
  192. }
  193. return 0;
  194. }

T3:考场上画了好久图,找了好久性质,硬生生一个性质都找不出来,发现自己图论能力过于单薄,吐了。

做T3的时候顺带把T1的拍子改成验证极限数据用时,发现几百组极限数据只有一组到了

  1. //I ball ball you.
  2. #include<stdio.h>
  3. const int maxn=1005,maxm=200005;
  4. int n,m,e,stp;
  5. int xx[maxm],yy[maxm],ans[maxm],start[maxn],to[maxm],then[maxm],vis[maxn],ban[maxn];
  6. inline void add(int x,int y){
  7. then[++e]=start[x],start[x]=e,to[e]=y;
  8. }
  9. int dfs(int x,int t,int stp){
  10. if(ban[x]==1)
  11. return 0;
  12. if(x==t)
  13. return 1;
  14. vis[x]=stp;
  15. for(int i=start[x];i;i=then[i]){
  16. int y=to[i];
  17. if(vis[y]!=stp&&dfs(y,t,stp))
  18. return 1;
  19. }
  20. return 0;
  21. }
  22. int f(int x){
  23. int res=0;
  24. for(int i=1;i<=x;i++)
  25. if(dfs(x,i,++stp)&&dfs(i,x,++stp))
  26. res++,ban[i]=1;
  27. for(int i=1;i<=n;i++)
  28. ban[i]=0;
  29. return res;
  30. }
  31. int calc(){
  32. int res=0;
  33. for(int i=1;i<=n;i++){
  34. int now=f(i);
  35. res+=now;
  36. }
  37. return res;
  38. }
  39. int main(){
  40. freopen("graph.in","r",stdin);
  41. freopen("graph.out","w",stdout);
  42. scanf("%d%d",&n,&m);
  43. for(int i=1;i<=m;i++)
  44. scanf("%d%d",&xx[i],&yy[i]);
  45. ans[m]=n;
  46. for(int i=m;i>=1;i--){
  47. add(xx[i],yy[i]);
  48. ans[i-1]=calc();
  49. }
  50. for(int i=0;i<=m;i++)
  51. printf("%d%c",ans[i],i==m? '\n':' ');
  52. return 0;
  53. }

回家后打了一下板子:

P3376 【模板】网络最大流

P3381 【模板】最小费用最大流

P5854 【模板】笛卡尔树

P4195 【模板】扩展BSGS

P2495 [SDOI2011]消耗战

4月11日 Day 2

又带了一大袋零食去考场,一遍输对密码,针不戳。(这个时候珂怜的xzy没有发现这实际上是一个上午噩梦的开始)

T1:审了一下题,想了想能不能建自动机匹配,发现似乎做不到/dk,然后想了想倍增,没想到什么做法。

然后直接树分块!

在树上撒个关键点,每个点与其祖先里的关键点距离为,然后发现可以把询问的路径分成个散块和个整块,散块暴力跳(记得把到另一端的路径反向,我因为反向调了一个多小时),整块可以预处理第个关键点跳到祖先关键点这一条链,从位置开始匹配能匹配到哪里,不难发现(我想了十几分钟)可以用并查集维护所有位置同时进行匹配,同样还要反过来做一遍。

具体地,可以把整块对应的链上权值序列当成一个普通的序列,与长度为m的串进行匹配,然后对于每个位置可以维护它在匹配的过程中到了哪一个位置,不难发现把相同的位置在匹配的过程中会不断合并,那么直接上并查集就好了。

时间复杂度为:,常数极大,大样例要跑

算了一下,林林总总花了个多小时刚T1吧,结果最后的成绩还是那么丢人/ll。

正解就是我首先排除的倍增/ll。

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<math.h>
  4. using namespace std;
  5. const int maxc=50005,maxn=200005,maxm=maxn<<1,maxk=25,maxt=1005;
  6. int n,m,c,e,Q,tot,S,qtot;
  7. int p[maxc],w[maxn],start[maxn],to[maxm],then[maxm],dep[maxn],fore[maxn][maxk],ok[maxn],P[maxn],q[maxn],qq[maxn],keyfa[maxn],pos[maxn],res[maxt][maxc],f[maxc],size[maxc],nowans[maxc],flag[maxc],revres[maxt][maxc];
  8. inline int cmp(int a,int b){
  9. return dep[a]>dep[b];
  10. }
  11. inline void add(int x,int y){
  12. then[++e]=start[x],start[x]=e,to[e]=y;
  13. }
  14. void dfs(int x,int last){
  15. fore[x][0]=last,dep[x]=dep[last]+1;
  16. for(int i=1;i<=20;i++)
  17. fore[x][i]=fore[fore[x][i-1]][i-1];
  18. for(int i=start[x];i;i=then[i]){
  19. int y=to[i];
  20. if(y==last)
  21. continue;
  22. dfs(y,x);
  23. }
  24. }
  25. int lca(int a,int b){
  26. if(dep[a]<dep[b])
  27. a+=b,b=a-b,a-=b;
  28. for(int i=20;i>=0;i--)
  29. if(dep[fore[a][i]]>=dep[b])
  30. a=fore[a][i];
  31. if(a==b)
  32. return a;
  33. for(int i=20;i>=0;i--)
  34. if(fore[a][i]!=fore[b][i])
  35. a=fore[a][i],b=fore[b][i];
  36. return fore[a][0];
  37. }
  38. void solve(int x,int last,int key){
  39. if(x!=1&&ok[x]){
  40. keyfa[x]=key;
  41. key=x;
  42. }
  43. for(int i=start[x];i;i=then[i]){
  44. int y=to[i];
  45. if(y==last)
  46. continue;
  47. solve(y,x,key);
  48. }
  49. }
  50. int cnt1,cnt2,cnt3;
  51. int tmp1[maxn],tmp2[maxn],tmp3[maxn];
  52. int query(int x,int y,int id){
  53. int z=lca(x,y);
  54. if(1ll*(dep[x]+dep[y]-2*dep[z]+1)*Q<=400000000){
  55. int RES=1;
  56. for(int j=x;j!=z;j=fore[j][0])
  57. if(RES<=c&&p[RES]==w[j]){
  58. RES++;
  59. if(RES>c)
  60. return c;
  61. }
  62. qtot=0;
  63. for(int j=y;j!=z;j=fore[j][0])
  64. qq[++qtot]=j;
  65. qq[++qtot]=z;
  66. for(int j=qtot;j>=1;j--)
  67. if(RES<=c&&p[RES]==w[qq[j]]){
  68. RES++;
  69. if(RES>c)
  70. return c;
  71. }
  72. return RES-1;
  73. }
  74. int RES=1;
  75. while(ok[x]==0&&x!=z){
  76. if(RES<=c&&p[RES]==w[x]){
  77. RES++;
  78. if(RES>c)
  79. return c;
  80. }
  81. if(id==1)
  82. printf("BF_x_up %d res=%d\n",x,RES);
  83. x=fore[x][0];
  84. }
  85. while(x>0&&dep[keyfa[x]]>=dep[z]){
  86. if(id==1)
  87. printf("sqrt_x %d res=%d\n",x,res[ok[x]][RES]);
  88. if(RES<=c){
  89. RES=res[ok[x]][RES];
  90. if(RES>c)
  91. return c;
  92. }
  93. x=keyfa[x];
  94. }
  95. while(x!=z){
  96. if(RES<=c&&p[RES]==w[x]){
  97. RES++;
  98. if(RES>c)
  99. return c;
  100. }
  101. if(id==1)
  102. printf("BF_x_to_z %d res=%d\n",x,RES);
  103. x=fore[x][0];
  104. }
  105. if(RES<=c&&p[RES]==w[z]){
  106. RES++;
  107. if(RES>c)
  108. return c;
  109. }
  110. if(id==1)
  111. printf("BF_z %d\n",z);
  112. cnt1=cnt2=cnt3=0;
  113. while(ok[y]==0&&y!=z)
  114. tmp1[++cnt1]=y,y=fore[y][0];
  115. while(y>0&&dep[keyfa[y]]>=dep[z])
  116. tmp2[++cnt2]=y,y=keyfa[y];
  117. while(y!=z)
  118. tmp3[++cnt3]=y,y=fore[y][0];
  119. for(int i=cnt3;i>=1;i--){
  120. if(id==1)
  121. printf("BF_z_to_y %d res=%d\n",tmp3[i],RES);
  122. if(RES<=c&&p[RES]==w[tmp3[i]]){
  123. RES++;
  124. if(RES>c)
  125. return c;
  126. }
  127. }
  128. for(int i=cnt2;i>=1;i--){
  129. if(id==1)
  130. printf("sqrt_y %d res=%d\n",tmp2[i],revres[ok[tmp2[i]]][RES]);
  131. if(RES<=c){
  132. RES=revres[ok[tmp2[i]]][RES];
  133. if(RES>c)
  134. return c;
  135. }
  136. }
  137. for(int i=cnt1;i>=1;i--){
  138. if(id==1)
  139. printf("BF_y_down %d res=%d\n",tmp1[i],RES);
  140. if(RES<=c&&p[RES]==w[tmp1[i]]){
  141. RES++;
  142. if(RES>c)
  143. return c;
  144. }
  145. }
  146. return RES-1;
  147. }
  148. int find(int x){
  149. return f[x]==x? x:f[x]=find(f[x]);
  150. }
  151. void merge(int a,int b){
  152. a=find(a),b=find(b);
  153. if(size[a]>size[b])
  154. a+=b,b=a-b,a-=b;
  155. f[a]=b,size[b]+=size[a];
  156. }
  157. int main(){
  158. freopen("gem.in","r",stdin);
  159. freopen("gem.out","w",stdout);
  160. scanf("%d%d%d",&n,&m,&c);
  161. for(int i=1;i<=c;i++)
  162. scanf("%d",&p[i]),pos[p[i]]=i;
  163. for(int i=1;i<=n;i++)
  164. scanf("%d",&w[i]),P[i]=i;
  165. for(int i=1;i<n;i++){
  166. int x,y;
  167. scanf("%d%d",&x,&y);
  168. add(x,y),add(y,x);
  169. }
  170. dfs(1,0),sort(P+1,P+1+n,cmp);
  171. S=sqrt(n),ok[1]=++tot,q[tot]=1;
  172. if(n>1000)
  173. S=200;
  174. for(int i=1;i<=n;i++){
  175. int x=P[i],y=x,flg=ok[y];
  176. while(dep[x]-dep[y]<S&&flg==0)
  177. y=fore[y][0],flg|=(ok[y]);
  178. if(flg==0)
  179. ok[y]=++tot,q[tot]=y;
  180. }
  181. solve(1,0,1);
  182. for(int i=1;i<=tot;i++){
  183. int x=q[i];
  184. for(int j=1;j<=c;j++)
  185. f[j]=j,size[j]=1,nowans[j]=j,flag[j]=j;
  186. qtot=0;
  187. //nowans[startpos]=nowpos flag[nowpos]=find(all startpos)
  188. for(int j=x;j!=keyfa[x];j=fore[j][0]){
  189. qq[++qtot]=j;
  190. int now=pos[w[j]],fnow=find(flag[now]);
  191. if(fnow==0)
  192. continue;
  193. flag[nowans[fnow]]=0;
  194. nowans[fnow]++;
  195. if(nowans[fnow]>c)
  196. continue;
  197. int r=flag[nowans[fnow]];
  198. if(r==0)
  199. flag[nowans[fnow]]=fnow;
  200. else merge(fnow,r),flag[nowans[fnow]]=fnow;
  201. }
  202. for(int j=1;j<=c;j++){
  203. res[i][j]=nowans[find(j)];
  204. // printf("res[%d][%d]=%d\n",i,j,res[i][j]);
  205. }
  206. for(int j=1;j<=c;j++)
  207. f[j]=j,size[j]=1,nowans[j]=j,flag[j]=j;
  208. for(int k=qtot;k>=1;k--){
  209. int j=qq[k],now=pos[w[j]],fnow=find(flag[now]);
  210. if(fnow==0)
  211. continue;
  212. flag[nowans[fnow]]=0;
  213. nowans[fnow]++;
  214. if(nowans[fnow]>c)
  215. continue;
  216. int r=flag[nowans[fnow]];
  217. if(r==0)
  218. flag[nowans[fnow]]=fnow;
  219. else merge(fnow,r),flag[nowans[fnow]]=fnow;
  220. }
  221. for(int j=1;j<=c;j++){
  222. revres[i][j]=nowans[find(j)];
  223. // printf("revres[%d][%d]=%d\n",i,j,revres[i][j]);
  224. }
  225. }
  226. scanf("%d",&Q);
  227. for(int i=1;i<=Q;i++){
  228. int x,y;
  229. scanf("%d%d",&x,&y);
  230. printf("%d\n",query(x,y,0));
  231. }
  232. return 0;
  233. }

T2:由于在全力刚T1,因此T2只写了个爆搜,最后竟然还写挂了,丢人。

  1. #include<stdio.h>
  2. const int maxn=15;
  3. int n,m,fir;
  4. int a[maxn],used[maxn],p[maxn];
  5. long long ans;
  6. inline int max(int a,int b){
  7. return a>b? a:b;
  8. }
  9. void dfs(int x,int rk1,int sum,int val,int add){
  10. if(sum>m)
  11. return ;
  12. if(x>n){
  13. ans++;
  14. return ;
  15. }
  16. for(int i=1;i<=n;i++)
  17. if(used[i]==0){
  18. used[i]=1,p[x]=i;
  19. int v=val+(i>rk1),ad=max(add,v-a[i]);
  20. dfs(x+1,i,sum+ad,v,ad);
  21. used[i]=0;
  22. }
  23. }
  24. int main(){
  25. freopen("ranklist.in","r",stdin);
  26. freopen("ranklist.out","w",stdout);
  27. scanf("%d%d",&n,&m);
  28. a[0]=-1;
  29. for(int i=1;i<=n;i++){
  30. scanf("%d",&a[i]);
  31. if(a[i]>a[fir])
  32. fir=i;
  33. }
  34. dfs(1,fir,0,a[fir],0);
  35. printf("%lld\n",ans);
  36. return 0;
  37. }

T3:写了个的丢人暴力走人/kk。

实际上可以直接上优化做到更优复杂度的,但是刚T1去了,就没加上去。

  1. #include<stdio.h>
  2. #include<vector>
  3. using namespace std;
  4. const int maxn=3005,maxm=maxn<<1,maxk=25;
  5. int n,m,q,e,stp;
  6. int start[maxn],to[maxm],then[maxm],fa[maxn],size[maxn],dep[maxn],g[maxn][maxn],vis[maxn],flg[maxn],fore[maxn][maxk];
  7. inline void add(int x,int y){
  8. then[++e]=start[x],start[x]=e,to[e]=y;
  9. }
  10. void dfs(int x){
  11. size[x]=1,fore[x][0]=fa[x];
  12. for(int i=1;i<=20;i++)
  13. fore[x][i]=fore[fore[x][i-1]][i-1];
  14. for(int i=start[x];i;i=then[i]){
  15. int y=to[i];
  16. fa[y]=x,dep[y]=dep[x]+1;
  17. dfs(y),size[x]+=size[y];
  18. }
  19. }
  20. int lca(int a,int b){
  21. if(dep[a]<dep[b])
  22. swap(a,b);
  23. for(int i=20;i>=0;i--)
  24. if(dep[fore[a][i]]>=dep[b])
  25. a=fore[a][i];
  26. if(a==b)
  27. return a;
  28. for(int i=20;i>=0;i--)
  29. if(fore[a][i]!=fore[b][i])
  30. a=fore[a][i],b=fore[b][i];
  31. return fore[a][0];
  32. }
  33. void get(int x,int B){
  34. if(x==B)
  35. return ;
  36. vis[x]=stp;
  37. for(int i=start[x];i;i=then[i]){
  38. int y=to[i];
  39. if(vis[y]==stp)
  40. continue;
  41. get(y,B);
  42. }
  43. }
  44. int main(){
  45. freopen("dominator.in","r",stdin);
  46. freopen("dominator.out","w",stdout);
  47. scanf("%d%d%d",&n,&m,&q);
  48. for(int i=1;i<=m;i++){
  49. int x,y;
  50. scanf("%d%d",&x,&y);
  51. add(x,y);
  52. }
  53. if(m==n-1)
  54. dfs(1);
  55. for(int i=1;i<=n;i++){
  56. stp++,get(1,i);
  57. for(int j=1;j<=n;j++)
  58. g[i][j]|=(vis[j]!=stp);
  59. }
  60. for(int i=1;i<=q;i++){
  61. int x,y;
  62. scanf("%d%d",&x,&y);
  63. if(m==n-1){
  64. if(lca(x,y)!=fa[y])
  65. printf("%d\n",size[x]);
  66. else puts("0");
  67. continue;
  68. }
  69. int res=0;
  70. add(x,y);
  71. for(int j=1;j<=n;j++){
  72. stp++,get(1,j);
  73. for(int k=1;k<=n;k++)
  74. flg[k]|=((vis[k]!=stp)^g[j][k]);
  75. }
  76. for(int j=1;j<=n;j++)
  77. res+=flg[j],flg[j]=0;
  78. start[x]=then[e],e--;
  79. printf("%d\n",res);
  80. }
  81. return 0;
  82. }

测了一下民间数据,只有,fst了60分,远低于人均水平/ll

orz民间数据吊打我的juju。

总结一下,还是考试的时候很多思路没有完全成型,或者被hack掉就直接开始写了,因此浪费了大量时间,也导致拿部分分的时间不够。

同样还因为我的思维还不够强,因此很多部分分都没有较成熟的思路,也因此fst。

最后这个难看的分数也或多或少和我最后几天的颓废没有良好的状态有关系吧。

「随风凋零的,是某人从未打算实现的空想,还是落入海面继续下沉的烟花」

不管怎么样,我们都有光明的未来!

附赠负数天数的做题记录:

3月17日 Day -23

做了一道有意思的交互题CF1364E X-OR

复习树剖。人老了,以前15分钟的树剖已经要30分钟了。

把弦图mcs算法板子打了一遍过了两道板题:P3196 [HNOI2008]神奇的国度,P3852 [TJOI2007]小朋友

在u群问了noi2020翻修道路的中文题解,然后看不懂。

CF891C Envy:有意思的

3月18日 Day -22

中午划水的时候写了一个树上简单博弈P5801 [SEERC2019]Game on a Tree

复习树剖写了一道板题P4312 [COI2009] OTOCI,调了好久,然后就卡到最优解第一名了。

复习fhq-treap。虽然忘光了,打一遍就想起来了:P3369 【模板】普通平衡树,P6136 【模板】普通平衡树(数据加强版),然后做非模板题一道都做不出来。。。

3月19日 Day -21

UVA1711 Catering:上下界网络流水题

下午lk讲了博弈论,竟然自己做出一道题,《震惊!初三废物xzy竟然会做博弈论》AT3727 [ARC087C] Prefix-free Game

CF142B Help General:打"General"

P6560 [SBCOI2020] 时光的流逝:博弈

P7419 「PMOI-2」参天大树:dp分类讨论题,有点意思

3月20日 Day -20

P4466 [国家集训队]和与积:做一道莫反来保持手感




可以枚举,然后整除分块枚举统计答案。

复杂度不会证。

3月21日 Day -19

P5544 [JSOI2016]炸弹攻击1:模拟退火,这么套路的题一点意思都没有

P4212 外太空旅行:随机化求最大团的无趣题

P5239 回忆京都:水题

P4930 [PA2013]Euler,欧拉函数+搜索,Solution

3月22日 Day -18

日报挂上去了,但是@上了我的小号,非常尬。

P4424 [HNOI/AHOI2018]寻宝游戏:myy毒瘤题,蛮好玩的

3月23日 Day -17

P5292 [HNOI2019]校园旅行:myy毒瘤题Ⅱ,也是好玩的题目

P3344 [ZJOI2015]幻想乡 Wi-Fi 搭建计划:有点套路的结论题

日报改过来了耶!

达成成就:2天内大号小号均上洛谷日报

3月24日 Day -16

CF1188D Make Equal:有意思的思维题,好毒呀

AT2374 [AGC014B] Unplanned Queries:简单结论题

AT2363 [AGC012C] Tautonym Puzzle:有意思的构造题

P7446 [Ynoi2007] rfplca:lxl的毒瘤分块,写了好久,然后发现题解复杂度假了,调题目调到不想写博客了

终于绑定了SPOJ了,感谢NSObject的帮助!然后交了两道题:SP106 BINSTIRL - Binary Stirling Numbers,SP3734 PERIODNI - Periodni

3月25日&3月26日 Day -15&-14

第一次月考,划了两天水。

3月27日 Day -13

SP20173 DIVCNT2 - Counting Divisors (square):老毒瘤题了,硬生生卡了好久空间。。。

写一下推柿子过程吧:




然后可以用类似杜教筛的方法筛出的前项,然后写个整除分块,整除分块里求就用打出的表和算法结合就好了。

复杂度是

CF568E Longest Increasing Subsequence:复杂dp题,有点套路呀

SP7001 VLATTICE - Visible Lattice Points:反演裸题

P6860 象棋与马:有意思的杜教筛

P6810 「MCOI-02」Convex Hull 凸包:反演裸题

CF1491F Magnets:有一点点意思的交互题

3月28日 Day -12

P5307 [COCI2019] Mobitel:改变枚举状态的经典题+整除分块

P3579 [POI2014]PAN-Solar Panels:整除分块水题

CF354C Vasya and Beautiful Arrays:直接暴力,发现暴力的复杂度为调和级数

P2135 方块消除=UVA10559 方块消除 Blocks:区间dp套路题(由于状态里有一些改变,所以也可以划分到费用提前里就很离谱)

复习了一下费用提前,然后要写的例题一直咕咕咕。

UVA11134 传说中的车 Fabled Rooks:经典贪心题,直接行列分开

CF616E Sum of Remainders:整除分块细节题

CF963B Destruction of a Tree:有意思的构造题

CF276D Little Girl and Maximum XOR:XOR性质题,直接贪心

P3496 [POI2010]GIL-Guilds:水题

CF475D CGCDSSQ:利用了的性质的普通题

P4184 [USACO18JAN]Sprinklers P:基础dp优化,Solution

3月29日 Day -11

再次尝试调试SP1526 RSORTING - Ranklist Sorting,没有调出来

P7451 [THUSCH2017] 杜老师:dls/se,线性基套路题+结论题,Solution

划了一天水诶。。。

3月30日 Day -10

AT5697 [AGC041F] Histogram Rooks:笛卡尔树上背包dp+容斥套容斥的大毒瘤题,Solution

3月31日 Day -9

P5556 圣剑护符:一个线性基结论题

P5438 【XR-2】记忆:神仙推柿子题,不会分析复杂度

P6162 [Cnoi2020]四角链:熬夜把这道题做完了,是一个基础的第二类斯特林数组合意义题

4月1日 Day -8

初三弱鸡终于开始停课了!感动!

P2495 [SDOI2011]消耗战:复习了虚树板子题

P5680 [GZOI2017]共享单车:虚树基础题,感觉两个算法硬生生拼凑在一起特别没有美感

CF1320E Treeland and Viruses:虚树上dp

CF571A Lengthening Sticks:小学奥数题

P6298 齿轮:基础容斥

hh讲了ds,然后越讲越偏,越讲越偏。。。

P6965 [NEERC2016]Binary Code:trie树优化建图细节sb题,调不出来

4月2日 Day -7

CF424C Magic Formulas:改变顺序,然后直接暴力

P3293 [SCOI2016]美味:01trie板子题调了亿个小时

P4592 [TJOI2018]异或:套路题,直接类似主席树一样差分

P6018 [Ynoi2010] Fusion tree:Ynoi/se,其实就是01trie交换子树的小trick

P6031 CF1278F Cards 加强版:推柿子sb题,只觉得非常精神污染,Solution,顺便水了个弱化版CF1278F Cards

P2480 [SDOI2010]古代猪文:同余类数学综合题,复习了一下一些数学

4月3日 Day -6

P5298 [PKUWC2018]Minimax:线段树合并优化dp,利用线段树合并的性质

P5327 [ZJOI2019]语言:ZJOI神仙题/se,利用一个结论然后直接上线段树合并

P6773 [NOI2020] 命运:打同步赛的时候没写/kk,其实是一道线段树合并优化dp好题,Solution

P5903 【模板】树上 k 级祖先:长剖板子

CF1009F Dominant Indices:dsu on tree板子

CF715C Digit Tree:dsu on tree有意思的题,Solution

P5904 [POI2014]HOT-Hotels 加强版:长剖优化dp

4月4日 Day -5

P5113 Sabbat of the witch:屑分块题,快爬,调不出来

猛的发现博弈论还没复习,赶紧搞一下博弈论。

AT3939 [ARC091D] Strange Nim:博弈论+根号分治好题

CF1147C Thanos Nim:有点意思的猜不变量博弈论

CF15C Industrial Nim:博弈论+结论题

P4643 [国家集训队]阿狸和桃子的游戏:有意思的思维题,把边权转化为点权

CF36D New Game with a Chess Piece:分类讨论博弈论(双倍经验SP7602 CF36D - New Game with a Chess Piece

愚人节比赛

T171038 温故而知新:不会有人不会百度bv转av吧,不会吧?不会吧?

T173329 A+B Problem:看到A+B,直接粘P1601 A+B Problem(高精)的代码,直觉发现不要换行

T173878 买书送团队:做了好久的狗屎题,一开始直接上直线解析式,最后问了ykw才发现这是分段函数

T173049 驹草盛开的万年积雪:首先让hzr听出几个地方,然后直接调整一下就过了,据hzr说在这之后就单曲循环这首歌停不下来了(

T173046 风神的神德:首先把图片down下来,然后改成zip,然后再瞎搞一下就发现了T124363 风神的神德,然后由于私人题目可以看到错误信息,所以可以试出答案,再看回来,发现两题空间限制不同,一个32M一个16M,由于洛谷设置空间会直接四舍五入,所以可以猜测输出31.25%(考场没想到)

UVA1482 Playing With Stones:结论题

P2575 高手过招:阶梯博弈

P3480 [POI2009]KAM-Pebbles:阶梯博弈

P4279 [SHOI2008]小约翰的游戏:Anti-SG,直接上结论(双倍经验:UVA1566 John

AT2307 [AGC010F] Tree Game:就是个树上dp,似乎以前做过?

CF1221E Game With String:分类讨论好题

CF388C Fox and Card Game:基础博弈论

4月5日 Day -4

P5305 [GXOI/GZOI2019]旧词:好玩的树剖,其实就是P4211 [LNOI2014]LCA的加强版

P6374 「StOI-1」树上询问:LCA简单题

CF1498E Two Houses:竞赛图水题

SP9507 MARIO2 - Mario and Mushrooms:Raney引理板子题,Solution

CF1498A GCD Sum:简单题

CF1498F Christmas Game:有意思的阶梯博弈+换根dp

P1495 【模板】中国剩余定理(CRT)/曹冲养猪:CRT板子题

P4720 【模板】扩展卢卡斯:exLucas板子题,调了好久

P3846 [TJOI2007] 可爱的质数/【模板】BSGS:BSGS板子题

P4884 多少个1?:BSGS+简单转换

P2183 [国家集训队]礼物:exLucas板子题

P4861 按钮:BSGS板子题

月赛

P7478 StickSuger:不会有人不会做T1吧?不会吧?不会吧?直接贪就对了!

P7479 至曾是英雄的您:真的有绿题的必要吗?直接搜每个空位置的连通块就好了。

P7480 Reboot from Blue:难度骤增,不会做,爬了。。。

首先想到一个dp思路,但是不难发现还可以倒着走一段距离加油然后再去终点。

然后考虑了这一点之后又发现可以反复横跳,但是不难发现转移是从油价高到油价低的,因此直接dp。(这是考场思路)

看到绝对值不会优化了,其实很简单,只需要用存下dp值直接转移就好了。

P7481 梦现时刻:不想做的狗屎题,考场思路:固定,发现给每一项配上次方的式子可以通过卷积得到:,然后直接上NTT。

没有去改。

CF906D Power Tower:欧拉定理水题

P4454 [CQOI2018]破解D-H协议:BSGS板子题

P4195 【模板】扩展BSGS:exBSGS板子题(双倍经验SP3105 MOD - Power Modulo Inverted

4月6日 Day -3

P3726 [AH2017/HNOI2017]抛硬币:有意思的组合数学,调不出来

CF1117E Decypher the String:好玩的题!!!我喜欢字符串+分块的神仙题!!!/se/se/se

CF900D Unusual Sequences:容斥水题

P7325 [WC2021] 斐波那契:终于想起来改今年WC的题了(WC2021:伤心掉分场,挂的分数=拿的分数就很离谱)

CF679E Bear and Bad Powers of 42:有意思的线段树,调了挺久

P4198 楼房重建的线段树,有意思

P5535 【XR-3】小道消息:如果不知道前置知识说不定也能猜到结论,但是证不出来

4月7日 Day -2

P4254 [JSOI2008]Blue Mary开公司:李超线段树裸题,调了亿年(新增遇到就挂的特性)

P4097 [HEOI2013]Segment:李超线段树裸题,调了亿年

CF932F Escape Through Leaf:李超线段树合并优化dp,好题!!!

CF589H Tourist Guide:简单结论题,就是交不上去

CF875C National Property:2-SAT套路题

P3810 【模板】三维偏序(陌上花开):cdq板子

P3157 [CQOI2011]动态逆序对:cdq板子

CF584D Dima and Lisa:水题

CF527E Data Center Drama:卡常欧拉回路,没调出来

P3375 【模板】KMP字符串匹配:KMP板子

P4696 [CEOI2011]Matching:KMP好题!!!理解KMP的本质

P4427 [BJOI2018]求和:大水题,18年BJ出这种水题干什么

slay回来了,所以打了好久slay。

4月8日 Day -1

CF1200E Compress Words:KMP简单应用

P5410 【模板】扩展 KMP(Z 函数):Z函数板子

AT2040 [ARC060D] 最良表現 / Best Representation:结论题+KMP判循环串

P5357 【模板】AC自动机(二次加强版):AC机板子

CF710F String Set Queries:二进制拆分优化AC机

CF590E Birthday:类似P4298 [CTSC2008]祭祀,就是建出AC机之后搞最长反链。

又打了好久slay。

4月9日 Day 0

P3804 【模板】后缀自动机 (SAM):SAM板子

P2178 [NOI2015] 品酒大会:SAM简单应用,调了好久

P3389 【模板】高斯消元法:高斯消元板子(搞死小圆

P2973 [USACO10HOL]Driving Out the Piggies G:高斯消元裸题

CF24D Broken robot:带状高消

CF585F Digits of Number Pi:SAM上数位dp的好题

P6139 【模板】广义后缀自动机(广义 SAM):广义SAM

P4081 [USACO17DEC]Standing Out from the Herd P:广义SAM简单应用

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注