P8844 [传智杯 #4 初赛] 小卡与落叶 题解
分析
乱搞题。
发现每次操作
求这玩意直接树上启发式合并。记录答案的时候用值域分块求一下和就行。复杂度
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
#define PII pair<int,int>
#define x first
#define y second
const int N=1e5+10;
int n,m;
int ne[N<<1],e[N<<1],h[N],idx;
int dep[N],mson[N],siz[N];
int in[N],out[N],dfsx[N],cnt;
int cnt_dep[N];
int sum[N],len;
vector<PII> Q[N];
int ans[N],qidx;
il void add(int a,int b){ne[++idx]=h[a],e[idx]=b,h[a]=idx;}
il int get(int x){return (x-1)/len+1;}
il void Add(int x){++cnt_dep[dep[x]],++sum[get(dep[x])];}
il void Del(int x){--cnt_dep[dep[x]],--sum[get(dep[x])];}
il void merge(int x,int flag){
for(re int i=in[x];i<=out[x];++i)
if(flag) Add(dfsx[i]);
else Del(dfsx[i]);
return ;
}
il int query(int x){
int l=x,r=n,bl=get(x),br=get(n),ans=0;
if(bl==br){
for(re int i=l;i<=r;++i) ans+=cnt_dep[i];
return ans;
}
for(re int i=l;i<=bl*len;++i) ans+=cnt_dep[i];
for(re int bk=bl+1;bk<=br-1;++bk) ans+=sum[bk];
for(re int i=(br-1)*len+1;i<=r;++i) ans+=cnt_dep[i];
return ans;
}
il void dfs1(int now,int fa){
dfsx[++cnt]=now,in[now]=cnt;
dep[now]=dep[fa]+1,mson[now]=-1,siz[now]=1;
int msiz=0;
for(re int i=h[now];i;i=ne[i]){
int j=e[i];if(j==fa) continue;
dfs1(j,now),siz[now]+=siz[j];
if(msiz<siz[j]) msiz=siz[j],mson[now]=j;
}
out[now]=cnt;
return ;
}
il void dfs2(int now,int fa,int flag){
for(re int i=h[now];i;i=ne[i]){
int j=e[i];if(j==fa||j==mson[now]) continue;
dfs2(j,now,1);
}
if(mson[now]!=-1) dfs2(mson[now],now,0);
for(re int i=h[now];i;i=ne[i]){
int j=e[i];if(j==fa||j==mson[now]) continue;
merge(j,1);
}
Add(now);
for(re int j=0;j<Q[now].size();++j) ans[Q[now][j].x]=query(Q[now][j].y);
if(flag) merge(now,0);
return ;
}
il void solve(){
cin>>n>>m;len=sqrt(n);
for(re int i=1,a,b;i<n;++i)
cin>>a>>b,add(a,b),add(b,a);
int min_y=n+1;
for(re int i=1;i<=m;++i){
int op,x;cin>>op>>x;
if(op==1) min_y=x;
else Q[x].push_back({++qidx,min_y});
}
dfs1(1,0),dfs2(1,0,0);
for(re int i=1;i<=qidx;++i) cout<<ans[i]<<"\n";
}
signed main(){
solve();
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性