tuzhewen @ 2020-12-01 23:03:57
#include<bits/stdc++.h>
#define F(i,l,r) for(register int i=l;i<=r;i++)
#define D(i,r,l) for(register int i=r;i>=l;i--)
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define p_b push_back
#define m_p make_pair
#define il inline
#define fi first
#define se second
const int INF=0x3f3f3f3f,N=1e5+5;
using namespace std;
int n,m;
int u,v;
struct node {
int from,to,val,nxt;
}e[N<<1];
int ecnt,head[N];
void add(int u,int v) {
e[++ecnt].from=u;
e[ecnt].to=v;
e[ecnt].nxt=head[u];
head[u]=ecnt;
}
int fa[N],dep[N],top[N],son[N],siz[N],pos[N],cnt;
char op[2];
void dfs1(int now,int pre) {
fa[now]=pre,dep[now]=dep[pre]+1,siz[now]=1;
for(int i=head[now];~i;i=e[i].nxt) {
int to=e[i].to;
if(to!=pre) {
dfs1(to,now);
siz[now]+=siz[to];
if(siz[son[now]]<siz[to]) son[now]=to;
}
}
}
void dfs2(int now,int pre) {
if(son[now]) {
top[son[now]]=top[now];
pos[son[now]]=++cnt;
dfs2(son[now],now);
}
else return ;
for(int i=head[now];~i;i=e[i].nxt) {
int to=e[i].to;
if(to!=pre&&to!=son[now]) {
top[to]=to;
pos[to]=++cnt;
dfs2(to,now);
}
}
}
ll ans[N<<2],tag[N<<2];
il int ls(int x) {return x<<1;}
il int rs(int x) {return x<<1|1;}
il void push_up(int p) {ans[p]=ans[ls(p)]+ans[rs(p)];}
il void f(int p,int l,int r,ll k) {
ans[p]+=(r-l+1)*k;
tag[p]+=k;
}
il void push_down(int p,int l,int r) {
if(tag[p]) {
int mid=(l+r)>>1;
f(ls(p),l,mid,tag[p]);
f(rs(p),mid+1,r,tag[p]);
tag[p]=0;
}
}
il void upd(int p,int l,int r,int nl,int nr,ll k) {
if(nl<=l&&nr>=r) {
f(p,l,r,k);
return ;
}
push_down(p,l,r);
int mid=(l+r)>>1;
if(nl<=mid) upd(ls(p),l,mid,nl,nr,k);
if(nr>mid) upd(rs(p),mid+1,r,nl,nr,k);
push_up(p);
}
il ll query(int p,int l,int r,int ql,int qr) {
if(ql<=l&&qr>=r) return ans[p];
push_down(p,l,r);
int mid=(l+r)>>1;ll res=0;
if(ql<=mid) res+=query(ls(p),l,mid,ql,qr);
if(qr>mid) res+=query(rs(p),mid+1,r,ql,qr);
return res;
}
il int upd_chain(int u,int v,int k) {
int fu=top[u],fv=top[v];
while(fu!=fv) {
if(dep[fu]<dep[fv]) swap(fu,fv),swap(u,v);
upd(1,1,n,pos[fu],pos[u],k);
u=fa[u],fu=top[u];
}
if(dep[u]>dep[v]) swap(u,v);
upd(1,1,n,pos[u]+1,pos[v],k);
}
int main() {
mem(head,-1);
scanf("%d%d",&n,&m);
F(i,1,n-1) {
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
dfs1(1,0);dep[1]=1;cnt=pos[1]=1,top[1]=1;dfs2(1,0);
while(m--) {
scanf("%s %d%d",op,&u,&v);
if(op[0]=='P') {
upd_chain(u,v,1);
}
if(op[0]=='Q') {
if(fa[u]==v) printf("%lld\n",query(1,1,n,pos[u],pos[u]));
else printf("%lld\n",query(1,1,n,pos[v],pos[v]));
}
}
return 0;
}
求助神仙!
by ttys000 @ 2020-12-11 20:41:01
萌新。。