更新完毕 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;
}
```