【比赛记录】2025CSP-S模拟赛21

A B C D Sum Rank
25 - 5 - 30 16/19

连着坠🐓两场了。

A. kotori

不难想到将每个投票装置的答案都贡献到根链上,查询的时候也在根链查询。但是这样会将一部分非法的答案算入,解决方案是以第一个装置为根。

我们发现这时只需要在新加入点时将根链最小值贡献给答案,而这个值可以预处理出来,因此时间复杂度线性。

Code
#include<bits/stdc++.h>
#define ll long long
#define il inline
#define pb push_back
using namespace std;
namespace asbt{
namespace IO{
	const int bufsz=1<<20;
	char ibuf[bufsz],*p1=ibuf,*p2=ibuf;
	#define getchar() (p1==p2&&(p2=(p1=ibuf)+fread(ibuf,1,bufsz,stdin),p1==p2)?EOF:*p1++)
	il int read(){
		char ch=getchar();
		while(ch<'0'||ch>'9'){
			ch=getchar();
		}
		int x=0;
		while(ch>='0'&&ch<='9'){
			x=(x<<1)+(x<<3)+(ch^48);
			ch=getchar();
		}
		return x;
	}
	#undef getchar
}
using IO::read;
const int maxn=1e6+5;
int n,m,rt,sb[maxn];
vector<int> e[maxn];
il void dfs(int u,int fa){
//	cout<<u<<"\n";
	for(int v:e[u]){
		if(v==fa){
			continue;
		}
		sb[v]=min(v,sb[u]);
		dfs(v,u);
	}
}
int main(){
	n=read(),m=read();
//	cout<<n<<" "<<m<<"\n";
	for(int i=1,u,v;i<n;i++){
		u=read(),v=read();
		e[u].pb(v),e[v].pb(u);
	}
	read(),rt=read()%n+1;
	sb[rt]=rt,dfs(rt,0);
//	for(int i=1;i<=n;i++){
//		cout<<sb[i]<<" ";
//	}
//	cout<<"\n";
	int ans=rt,Ans=0;
	while(--m){
		int opt=read(),u=(read()+Ans)%n+1;
		if(opt==1){
			ans=min(ans,sb[u]);
		}
		else{
			Ans=min(ans,sb[u]);
			cout<<Ans<<"\n";
		}
	}
	return 0;
}
}
int main(){return asbt::main();}

B. charlotte

写出了平方复杂度的暴力 DP,换根是死都调不出来了。所以————————————

点击展开

C. sagiri

D. chtholly

posted @ 2025-07-19 21:38  zhangxy__hp  阅读(36)  评论(0)    收藏  举报