syta @ 2022-08-15 19:29:41
rt,虽然树剖这种恶心东西可能没人调,不过我翻遍提交记录发现没有一个37pts的/dk
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m;
vector<int> g[N];
int f[N],dep[N],siz[N],mxson[N];
int dfn[N],top[N];
void dfs1(int x,int fa){
f[x]=fa;
dep[x]=dep[fa]+1;
siz[x]=1;
for(int i=0;i<g[x].size();i++){
int to=g[x][i];
if(to==fa)continue;
dfs1(to,x);
siz[x]+=siz[to];
if(siz[mxson[x]]<siz[to])mxson[x]=to;
}
}
int cnt;
void dfs2(int x,int topf){
top[x]=topf;
dfn[x]=++cnt;
if(!mxson[x])return;
dfs2(mxson[x],topf);
for(int i=0;i<g[x].size();i++){
int to=g[x][i];
if(to==f[x]||to==mxson[x])continue;
dfs2(to,to);
}
}
struct tree{
int l,r,tag;
}t[N*4];
void build(int l,int r,int p){
t[p].l=l,t[p].r=r;
t[p].tag=0;
if(l==r)return;
int mid=(l+r)>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
}
void modify(int lx,int rx,int p){
if(t[p].l==lx&&t[p].r==rx){
t[p].tag++;
return;
}
int mid=(t[p].l+t[p].r)>>1;
if(rx<=mid)modify(lx,rx,p<<1);
else if(lx>mid)modify(lx,rx,p<<1|1);
else{
modify(lx,mid,p<<1);
modify(mid+1,rx,p<<1|1);
}
}
void update_route(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]>=dep[top[y]]){
modify(dfn[top[x]],dfn[x],1);
x=f[top[x]];
}else{
modify(dfn[top[y]],dfn[y],1);
y=f[top[y]];
}
}
if(dep[x]<dep[y])modify(dfn[x]+1,dfn[y],1);
else modify(dfn[y]+1,dfn[x],1);
}
int query(int x,int p){
if(t[p].l==t[p].r)return t[p].tag;
int ans=t[p].tag;
int mid=(t[p].l+t[p].r)>>1;
if(x<=mid)ans+=query(x,p<<1);
else ans+=query(x,p<<1|1);
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
dfs1(1,0);
dfs2(1,1);
build(1,n,1);
while(m--){
char opt[5];
int u,v;
scanf("%s%d%d",opt,&u,&v);
if(opt[0]=='P'){
update_route(u,v);
}else{
if(dep[u]<dep[v])swap(u,v);
printf("%d\n",query(dfn[u],1));
}
}
return 0;
}
by Saka_Noa @ 2022-08-15 19:42:02
你的区间加是不是写假了
by spark_minous @ 2022-08-15 19:42:03
%%%syt
by Saka_Noa @ 2022-08-15 19:45:28
@sabkx 初始全为0
by Saka_Noa @ 2022-08-15 19:45:55
@sabkx 不需要
by syta @ 2022-08-15 19:47:31
@Himezaka_noai 欸是吗?我就照着区间加单点查的标记永久化线段树写的/dk
by syta @ 2022-08-15 19:48:42
@sabkx 是的就像那位dalao说的一样,我觉得都是0就没pushup
by Saka_Noa @ 2022-08-15 19:49:19
@syta 永久标记吗,我没写过,那我看错了
by waauto @ 2022-08-15 19:55:31
modify加一句话
if(t[p].r<lx|t[p].l>rx)return;
by waauto @ 2022-08-15 19:56:30
另外,lazytag不用初始化
by syta @ 2022-08-15 19:56:50
@RainL A了谢谢喵