【比赛记录】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,换根是死都调不出来了。所以————————————
点击展开

浙公网安备 33010602011771号