【比賽記錄】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號