CSP2024 游记

更新完毕 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 查分

\(100+100+100+32=332\),一分没挂,应该有厕所去。

《别样的挂分大战》

感受

回想起去年我还什么都不会,曾经的我还以为学 OI 比别人落后几年就追不回来了甚至一度想放弃 OI 老老实实学文化课。

希望 NOIP 把我这份好运延续下去!

Code

T1

//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

//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

//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

// 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;
}
posted @ 2024-09-20 18:32  Linge_Zzzz  阅读(5)  评论(0编辑  收藏  举报  来源