CSP2024 游记

Linge_Zzzz

2024-09-20 18:32:11

Life & Travel

更新完毕 on 2024/11/4 18:34。

初赛 Day -1

被强迫做了 tder 的初赛模拟,怒砍 41pts。

阅读程序全蒙 C 结果只有一个选 C。

发现自己忘了欧拉回路和哈密顿回路的区别,复习了一下。

晚上打 cf,为啥每次遇到能用 ds 也能不用 ds 的题我都会直接大力 ds 并认定这是 ds 然后调不出来啊。掉大分。

初赛 Day 0

上午补觉,十一点半起床。

看群发现 J 组结束了,考了 UB???

下午骑车去省实验,累死我了。

面基到了 MrPython。

然后开始考试。

发卷子了,五分钟把选择除了最后一题秒了,花了一分钟看了看最后一题,只发现了两种方案就选上了。

然后开始阅读程序。第一大题不难注意到那一坨东西是按位或,然后就好做了。

第二大题私人 DP,没太看懂。最后一题蒙了一个上去(蒙错了)。

第三大题奇怪题,看了一会发现是树哈希,每个点的点权是它是不是质数,然后就好做了,但是做错很多。。

完形填空,第一大题简单题,第一小题犹豫了一下然后发现 std 的 upper_bound 也可能返回 end 就选了 A,最后发现选了五个 A??

第二大题,次短路,第一次接触到这个东西。看他思路大概是把每个点拆成两个点,然后做出来四个 A???

最后十题 9A1B???

虽然相信不了但是还是交了。

出考场发现大家都选了很多 A,但是只有我最后十题选了九个 A。走到大概快出大门的位置看到答案就是 AAAAA AABAA 就放心了。

回家之前把分对了,大概 84pts,然后骑车飞速回家。

打开小图灵一测,有 85pts,全省排名竟然有 13。

但是四元环数数数错了,我以为是 \binom{n}{4}。最后一题也数错了,没想到对偶图导致的。

聊了会天之后就启动 cs 了,赢了一把输了一把,然后和朋友打官匹。

了解到有泄题事件,这么牛!

十点多查分,82 pts,听说是因为 ccf 答案出错了。

Day -INF

停课了。

Day -INF/2

若干模拟赛。。。没有很多挂分。。。但是我好菜。。。

Day -2

马上 CSP 了,教练请了一次疯狂星期四!

机房举行押题大赛,我押了数学DP图论DP。

晚上闲的没事拿小号打了个 div.3 AK 了一下,perf 2300?果然还是 div.3 好上分

Day -1

上午睡大觉一直到十一点,起来吃了个饭。

吃完饭之后在打板子,把三个 Tarjan 板子打了,发现只有强联通分量一遍过了,然后打了个树剖,一遍过。

下午两点多出发,因为上午的火车票卖光了所以买了个先到青岛然后站票去日照的。火车上复习线性基。

六点半到了,吃了俩肉夹馍去试机。屏幕小,键盘手感还行,鼠标都是油。在机房外面到了 SXqwq,好帅,顺便送了个徽章(等我 NOIP 也要订徽章),顺便合了个影!

为保护隐私,合影就不放了(

试完机去了山外旗杆下,面到了若干大佬(RainPPR 很害羞没认出来,后来发现其实超级可爱!!)。

顺便有一张大合照!

是不是有一种壮士一去不复返的感觉。

晚上回家看了会手机就睡了,睡得挺好。

Day 0

早上起来是八点,吃不下饭,刷手机。

CSP-J 的题出来了,我测我咋不会 T4?哦我傻了。

很紧张,在路上心脏怦怦跳。怀念去年这个时候的我,什么都不会但是无所不能。

到考场了,父母和弟弟一直送我到考场门外,这下只能靠自己了。

进考场打了个缺省源突然想起没复习数论,打了个欧拉筛质数和欧拉筛欧拉函数,打对了,并且发现考场机子跑 10^8 欧拉筛要 1.3s

发压缩包密码,看了看输入输出文件,感觉 arena 是图论题,并且只有 duel 是单组数据。

发 PDF 密码,T1 是啥签到题?T2 需要物理公式,瞪了几眼之后会了 O(Tn\log n),T3 看了一眼确定是 DP,T4 体面太长且不是图论题。

先花 5min 切了 T1 然后写 T2,写了 20min 一遍过了 #1 和 #2,在 #3 发现 v=V 不算超速,改了之后把后面的全过了,算是比较顺利,过了就去看 T3 了。

一眼会了 50 分做法,O(n^2) 复杂度,写完到了 15:00,之后一直在优化 O(n^2) 发现没前途于是去想想 O(nV) 发现很有前途于是就会了正解,此时写完是 16:00,还有一个半小时,已经有 300 分了,赢麻了是不是。

开 T4,这啥使题啊,读了一会题面读懂了,先写个 O(n^3) 的暴力看看。写写写,#1 过了,#2 死活过不去,调试了一个小时之后发现哪里都对但就是答案不对,怀疑自己读错题了,回去认真读了一遍果然还真读错了。错在关于“第 r 轮”的区分上,改改改,就过了 #2 和 #3。有理由怀疑 #1 是特殊构造故意让人读错题的。

此时还剩半个小时,感觉 O(n^2) 很麻烦,想了想 A 性质感觉想完也写不完了,于是回去检查文件,静态查错,没有发现任何错误。

18:30 出考场,挺激动的,去年我只有 140 分,今年如果不挂分就有 332,见证了我一年的努力。

出去一问,人均 300+,我好菜www。

在旗杆等了一会面基,但是并没有人来,于是去火车站。

紧赶慢赶上了火车,偶遇三年前认识的一个朋友,不由得感叹时光流逝之快。

看到群友讨论,T4 是黑?CSP 咋又出黑了。另外发现确实人均 300+

回家已经十一点了,默写了一下 T1 代码交到自测上发现没挂分,另外听说【数据删除】?

跟 DengDuck 以及他的朋友玩了会 CS 就来写游记了(

Day 查分

[《别样的挂分大战》](https://www.luogu.com.cn/article/w2n1kdya)。 # 感受 回想起去年我还什么都不会,曾经的我还以为学 OI 比别人落后几年就追不回来了甚至一度想放弃 OI 老老实实学文化课。 希望 NOIP 把我这份好运延续下去! # Code ## T1 ```cpp //CSP-S 2024 RP++! #include <bits/stdc++.h> using namespace std; #define int long long typedef long long ll; typedef pair<int,int> pii; #define fi first #define se second #define mp make_pair #define pb push_back const int N=2e5+10,INF=0x3f3f3f3f3f3f3f3f,mod=1e9+7; int n,a[N],dis[N],b[N]; signed main(){ freopen("duel.in","r",stdin); freopen("duel.out","w",stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n; for(int i=1;i<=n;i++)cin>>a[i],dis[i]=a[i]; sort(dis+1,dis+1+n); int tot=unique(dis+1,dis+1+n)-dis-1; for(int i=1;i<=n;i++){ b[lower_bound(dis+1,dis+1+tot,a[i])-dis]++; } int ans=0,cnt=0; for(int i=1;i<=tot;i++){ int dt=min(cnt,b[i]); ans+=dt; cnt-=dt; cnt+=b[i]; } cout<<n-ans<<'\n'; return 0; } /* freopen("duel.in","w",stdin); freopen("duel.out","r",stdout); freopen("duel.in","r",stdout); freopen("duel.out","w",stdin); return 1; #include <bits\stdc++.h> int mian() */ ``` ## T2 ```cpp //CSP-S 2024 RP++! #include <bits/stdc++.h> using namespace std; #define int long long typedef long long ll; typedef pair<int,int> pii; #define fi first #define se second #define mp make_pair #define pb push_back const int N=1e5+10,L=1e6+10,INF=0x3f3f3f3f3f3f3f3f,mod=1e9+7; int n,m,l,V; int d[N],v[N],a[N]; int p[N]; struct Itv{ int l,r; Itv(){} Itv(int l,int r):l(l),r(r){} bool operator<(Itv &rhs){return r<rhs.r;} }; vector<Itv> itv; void solve(){ int ans1=0,ans2=0; cin>>n>>m>>l>>V; for(int i=1;i<=n;i++)cin>>d[i]>>v[i]>>a[i]; for(int i=1;i<=m;i++)cin>>p[i]; sort(p+1,p+1+m); int tot=unique(p+1,p+1+m)-p-1; for(int i=1;i<=n;i++){ int pos=lower_bound(p+1,p+1+tot,d[i])-p; if(pos>tot)continue; if(a[i]==0){ if(v[i]<=V)continue; ans1++; itv.pb(Itv(pos,tot)); } if(a[i]>0){ if(V*V>=2*a[i]*(p[tot]-d[i])+v[i]*v[i])continue; ans1++; int l=pos,r=tot; while(l<r){ int mi=(l+r)>>1; if(V*V<2*a[i]*(p[mi]-d[i])+v[i]*v[i])r=mi; else l=mi+1; } itv.pb(Itv(l,tot)); } if(a[i]<0){ if(V*V>=2*a[i]*(p[pos]-d[i])+v[i]*v[i])continue; ans1++; int l=pos,r=tot; while(l<r){ int mi=(l+r+1)>>1; if(V*V<2*a[i]*(p[mi]-d[i])+v[i]*v[i])l=mi; else r=mi-1; } itv.pb(Itv(pos,l)); } } sort(itv.begin(),itv.end()); int cur=-1; for(int i=0;i<itv.size();i++){ if(cur<itv[i].l){ ans2++; cur=itv[i].r; } } cout<<ans1<<' '<<m-ans2<<'\n'; itv.clear(); } signed main(){ freopen("detect.in","r",stdin); freopen("detect.out","w",stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int t;cin>>t; while(t--)solve(); return 0; } ``` ## T3 ```cpp //CSP-S 2024 RP++! #include <bits/stdc++.h> using namespace std; #define int long long typedef long long ll; typedef pair<int,int> pii; #define fi first #define se second #define mp make_pair #define pb push_back const int N=2e5+10,INF=0x3f3f3f3f3f3f3f3f,mod=1e9+7; int n,a[N]; /*namespace sub1{ const int N=2e4+10; int f[N][2],g[N][2],h[N][2]; void solve(){ memset(g,-0x3f,sizeof(g)); g[0][0]=g[0][1]=0; for(int i=2;i<=n;i++){ memset(f,-0x3f,sizeof(f)); memcpy(h,g,sizeof(h)); for(int j=1;j<i;j++){ h[j][0]=max(h[j-1][0],g[j][0]+(a[i]==a[j]?a[i]:0)); h[j][1]=max(h[j-1][1],g[j][1]+(a[i]==a[j]?a[i]:0)); } for(int j=0;j<i;j++){ f[j][0]=max(g[j][0]+(a[i]==a[i-1]?a[i]:0),h[i-1][1]); f[j][1]=max(g[j][1]+(a[i]==a[i-1]?a[i]:0),f[i-1][0]); } memcpy(g,f,sizeof(g)); } int ans=-INF; for(int j=0;j<n;j++){ ans=max(ans,f[j][0]); ans=max(ans,f[j][1]); } cout<<ans<<'\n'; } } namespace sub2{ const int N=2e5+10,V=12; int f[N][V][2]; bool vis[V]; void solve(){ memset(f,0,sizeof(f)); memset(vis,0,sizeof(vis)); f[1][0][0]=f[1][0][1]=0; vis[0]=vis[a[1]]=1; for(int i=2;i<=n;i++){ for(int j=0;j<=10;j++){ if(!vis[j])continue; f[i][j][0]=f[i-1][j][0]+(a[i]==a[i-1]?a[i]:0); f[i][j][1]=f[i-1][j][1]+(a[i]==a[i-1]?a[i]:0); } for(int k=0;k<=10;k++){ if(!vis[k])continue; f[i][a[i-1]][0]=max(f[i][a[i-1]][0],f[i-1][k][1]+(a[i]==k?a[i]:0)); } for(int k=0;k<=10;k++){ if(!vis[k])continue; f[i][a[i-1]][1]=max(f[i][a[i-1]][1],f[i-1][k][0]+(a[i]==k?a[i]:0)); } vis[a[i]]=1; } int ans=-INF; for(int j=0;j<=10;j++){ ans=max(ans,f[n][j][1]); ans=max(ans,f[n][j][0]); } cout<<ans<<endl; } }*/ namespace AC{ const int N=2e5+10,V=1e6+10; int f[V],addf,mxf,mxg,addg,g[V]; bool vis[V]; void solve(){ memset(vis,0,sizeof(vis)); memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); addf=mxf=addg=mxg=0; vis[0]=vis[a[1]]=1; f[0]=g[0]=0; for(int i=2;i<=n;i++){ int tmp=0; if(a[i]==a[i-1])tmp=a[i]; int mmxg=max(mxg,vis[a[i]]?g[a[i]]+a[i]:-INF); if(f[a[i-1]]+addf+tmp<mmxg+addg){ f[a[i-1]]=mmxg+addg-addf-tmp; } int mmxf=max(mxf,vis[a[i]]?f[a[i]]+a[i]:-INF); if(g[a[i-1]]+addg+tmp<mmxf+addf){ g[a[i-1]]=mmxf+addf-addg-tmp; } mxf=max(mxf,f[a[i-1]]); mxg=max(mxg,g[a[i-1]]); addf+=tmp,addg+=tmp; vis[a[i]]=1; } int ans=-INF; for(int i=0;i<=1e6;i++){ ans=max(ans,f[i]+addf); ans=max(ans,g[i]+addg); } cout<<ans<<'\n'; } } void solve(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; AC::solve(); } signed main(){ freopen("color.in","r",stdin); freopen("color.out","w",stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int t;cin>>t; while(t--)solve(); return 0; } ``` ## T4 ```cpp // CSP-S 2024 RP++! #include <bits/stdc++.h> using namespace std; #define int long long typedef long long ll; typedef pair<int,int> pii; #define fi first #define se second #define mp make_pair #define pb push_back const int N=500+10,T=13,INF=0x3f3f3f3f3f3f3f3f,mod=1e9+7; int n,m,k; int aa[N],tmpa[N],a[N],c[N],x[4]; char g[T][N]; int ge(int x){ int y=__lg(x); if((1ll<<y)<x)y++; return y; } int win[T][N]; void work(int r,int c,int kk){ if(r==kk){ win[r][c]=c; return; } work(r+1,c*2-1,kk); work(r+1,c*2,kk); if(g[kk-r][c]=='0'){ if(win[r+1][c*2-1]==-1)win[r][c]=-1; else if(a[win[r+1][c*2-1]]>=kk-r)win[r][c]=win[r+1][c*2-1]; else win[r][c]=win[r+1][c*2]; }else{ if(win[r+1][c*2]==-1)win[r][c]=-1; else if(a[win[r+1][c*2]]>=kk-r)win[r][c]=win[r+1][c*2]; else win[r][c]=win[r+1][c*2-1]; } } int aaa[N]; void solve(){ int ans=0; for(int i=1;i<=m;i++){ set<int> st; int mx=ge(c[i]); for(int j=c[i];j<=(1ll<<mx);j++){ memcpy(a,tmpa,sizeof(a)); for(int k=c[i]+1;k<=(1ll<<mx);k++){ if(k==j)a[k]=(1ll<<31)-1; else a[k]=0; } work(0,1,mx); if(win[0][1]!=-1)st.insert(win[0][1]); } int res=0; for(int x:st)res+=x; ans^=(res*i); } cout<<ans<<'\n'; } signed main(){ freopen("arena.in","r",stdin); freopen("arena.out","w",stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>m; k=__lg(n); if((1ll<<k)<n)k++; for(int i=1;i<=n;i++)cin>>aa[i]; for(int i=1;i<=m;i++)cin>>c[i]; for(int i=1;i<=k;i++)cin>>(g[i]+1); int t;cin>>t; while(t--){ for(int i=0;i<4;i++)cin>>x[i]; for(int i=1;i<=n;i++)tmpa[i]=(aa[i]^x[i%4]); solve(); } return 0; } ```