本地跑能正常输出,测试的时候呈现出一个非常有对称感的图形,求助为什么会错,谢谢!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define ll long long
#define il inline
#define N 100005
#define lc(x) (x<<1)
#define rc(x) (x<<1)|1
il ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') {f=-1;} c=getchar();}
while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
struct node {
ll lclr,rclr,sum;
node() {
}
node(ll _lclr,ll _rclr,ll _sum) {
lclr=_lclr,rclr=_rclr,sum=_sum;
}
};
struct sgt {
ll l,r;
ll lclr,rclr,sum,tag;
};
sgt tr[N<<2];
ll n,m;
vector<int> g[N];
ll fa[N],dep[N],son[N],siz[N],seg[N],rev[N],top[N],tot;
il void dfs1(ll u,ll f) {
fa[u]=f,dep[u]=dep[f]+1,siz[u]=1;
for(int i=0;i<g[u].size();i++) {
ll v=g[u][i];
if(v==f) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v]) son[u]=v;
}
}
il void dfs2(ll u,ll f) {
if(son[u]) {
seg[son[u]]=++tot;
rev[tot]=son[u];
top[son[u]]=top[u];
dfs2(son[u],u);
}
for(int i=0;i<g[u].size();i++) {
ll v=g[u][i];
if(!top[v]&&v!=f) {
seg[v]=++tot;
rev[tot]=v;
top[v]=v;
dfs2(v,u);
}
}
}
il void push_up(ll now) {
tr[now].lclr=tr[lc(now)].lclr,tr[now].rclr=tr[rc(now)].rclr;
tr[now].sum=tr[lc(now)].sum+tr[rc(now)].sum+(tr[lc(now)].rclr==tr[rc(now)].lclr);
}
il void build(ll now,ll l,ll r) {
tr[now].l=l,tr[now].r=r,tr[now].sum=tr[now].tag=0;
if(l==r) {
tr[now].lclr=tr[now].rclr=-rev[l];
return;
}
ll mid=(l+r)>>1;
build(lc(now),l,mid);
build(rc(now),mid+1,r);
push_up(now);
}
il void push_down(ll now) {
if(tr[now].tag) {
tr[lc(now)].lclr=tr[lc(now)].rclr=tr[now].tag;
tr[lc(now)].sum=tr[lc(now)].r-tr[lc(now)].l;
tr[lc(now)].tag=tr[now].tag;
tr[rc(now)].lclr=tr[rc(now)].rclr=tr[now].tag;
tr[rc(now)].sum=tr[rc(now)].r-tr[rc(now)].l;
tr[rc(now)].tag=tr[now].tag;
tr[now].tag=0;
}
}
il void modify(ll nl,ll nr,ll l,ll r,ll now,ll k) {
if(nl<=l&&r<=nr) {
tr[now].lclr=tr[now].rclr=k;
tr[now].sum=r-l;
tr[now].tag=k;
return;
}
push_down(now);
ll mid=(l+r)>>1;
if(nl<=mid) modify(nl,nr,l,mid,lc(now),k);
if(mid<nr) modify(nl,nr,mid+1,r,rc(now),k);
push_up(now);
}
il node query(ll qx,ll qy,ll l,ll r,ll now) {
if(qx<=l&&r<=qy) return node(tr[now].lclr,tr[now].rclr,tr[now].sum);
push_down(now);
ll mid=(l+r)>>1;
node ans=node(0,0,0);
if(qy<=mid) return query(qx,qy,l,mid,lc(now));
else if(mid<qx) return query(qx,qy,mid+1,r,rc(now));
else {
node ans1=query(qx,qy,l,mid,lc(now)),ans2=query(qx,qy,mid+1,r,rc(now));
ans.lclr=ans1.lclr,ans.rclr=ans2.rclr;
ans.sum=ans1.sum+ans2.sum+(ans1.rclr==ans2.lclr);
return ans;
}
}
il void cover(ll x,ll y,ll k) {
ll fx=top[x],fy=top[y];
while(fx!=fy) {
if(dep[fx]<dep[fy]) {
swap(x,y);
swap(fx,fy);
}
modify(seg[fx],seg[x],1,n,1,k);
x=fa[fx],fx=top[x];
}
if(dep[x]>dep[y]) swap(x,y);
modify(seg[x],seg[y],1,n,1,k);
}
node Ans[2];
il ll ask(ll x,ll y) {
ll fx=top[x],fy=top[y];
Ans[0]=Ans[1]=node(19260817,19260817,0);
bool flg=0;
while(fx!=fy) {
if(dep[fx]<dep[fy]) {
swap(x,y),swap(fx,fy);
flg^=1;
}
node tmp=query(seg[fx],seg[x],1,n,1);
if(flg) Ans[1]=node(tmp.lclr,Ans[1].rclr,Ans[1].sum+tmp.sum+(Ans[1].lclr==tmp.rclr));
else Ans[0]=node(Ans[0].lclr,tmp.lclr,Ans[0].sum+tmp.sum+(Ans[0].rclr==tmp.rclr));
x=fa[fx],fx=top[x];
}
if(dep[x]>dep[y]) {
swap(x,y);
flg^=1;
}
node tmp=query(seg[x],seg[y],1,n,1);
if(flg) Ans[1]=node(tmp.lclr,Ans[1].rclr,Ans[1].sum+tmp.sum+(Ans[1].lclr==tmp.rclr));
else Ans[0]=node(Ans[0].lclr,tmp.lclr,Ans[0].sum+tmp.sum+(Ans[0].rclr==tmp.rclr));
return Ans[0].sum+Ans[1].sum+(Ans[0].rclr==Ans[1].lclr);
}
int mian() {
n=read(),m=read();
for(int i=1;i<n;i++) {
int u=read(),v=read();
g[u].push_back(v);
g[v].push_back(u);
}
dfs1(1,0);
seg[1]=rev[1]=top[1]=tot=1;
dfs2(1,0);
build(1,1,n);
for(int i=1;i<=m;i++) {
ll opt=read(),a=read(),b=read();
if(opt==1) cover(a,b,i);
else printf("%lld\n",ask(a,b));
}
}
il void clean() {
memset(dep,0,sizeof(dep));
memset(fa,0,sizeof(fa));
for(int i=1;i<=n;i++) g[i].clear();
memset(rev,0,sizeof(rev));
memset(seg,0,sizeof(seg));
memset(siz,0,sizeof(siz));
memset(son,0,sizeof(son));
memset(top,0,sizeof(top));
for(int i=1;i<=4*n;i++) {
tr[i].l=tr[i].r=tr[i].lclr=tr[i].rclr=tr[i].sum=tr[i].tag=0;
}
tot=0;
}
ll _;
int main() {
_=read();
while(_--) {
clean();
mian();
}
return 0;
}