呜呜呜呜,改了好久都没对
查看原帖
呜呜呜呜,改了好久都没对
752774
KAxdd楼主2023/4/10 21:43

不知道哪里错了,呜呜呜,悬赏1个关注+5块

#include<bits/stdc++.h>
#define int long long 
#define mid (l+r>>1)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define len (r-l+1)

const int MAXN=1e5+5;
using namespace std;

struct node {
	int rs,ls,sum;
}a[4000005];

int head[2000005],to[2000005],nxt[2000005],mod,tot;//编表 

void add(int x,int y) {
	to[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}

int laz[4000005],res; //线段树板子

inline void pushdown(int rt,int l,int r){
    laz[rt<<1]=laz[rt];
    laz[rt<<1|1]=laz[rt];
    a[rt<<1].ls=a[rt<<1].rs=laz[rt];
    a[rt<<1|1].ls=a[rt<<1|1].rs=laz[rt];
    a[rt<<1].sum=(mid-l);
    a[rt<<1|1].sum=(r-mid-1);
    laz[rt]=0;
}

inline void build(int rt,int l,int r){
    if(l==r){
        a[rt].ls=0; a[rt].rs=0; a[rt].sum=0;
        return;
    }
    build(lson); build(rson);
}

node query(int rt,int l,int r,int L,int R){
    if(L<=l&&r<=R){
		return a[rt];
	} else {
		int flag=0;node w1,w2;
        if(laz[rt])pushdown(rt,l,r);
        if(L<=mid)flag++,w1=query(lson,L,R);
        if(R>mid)flag+=2,w2=query(rson,L,R);
        if(flag==1) return w1;
        if(flag==2) return w2;
        else { 
        	return (node){w1.ls,w2.rs,w1.sum+w2.sum+(w1.rs==w2.ls)};
		}
    }
}

inline void update(int rt,int l,int r,int L,int R,int k){
    if(L<=l&&r<=R){
    	a[rt]=(node){k,k,r-l};  
    	laz[rt]=k;
    } else{
        if(laz[rt])pushdown(rt,l,r);
        if(L<=mid)update(lson,L,R,k);
        if(R>mid)update(rson,L,R,k);
        a[rt]=(node){a[rt<<1].ls,a[rt<<1|1].rs,a[rt<<1].sum+a[rt<<1|1].sum+(a[rt<<1].rs==a[rt<<1|1].ls)};
    }
}

int dep[MAXN],fa[MAXN],siz[MAXN],top[MAXN],son[MAXN],id[MAXN],cnt;//树链剖分板子

void dfs1(int x,int f) {
	dep[x]=dep[f]+1; 
	fa[x]=f; 
	siz[x]=1;
	for(int i=head[x];i;i=nxt[i]) {
		if(to[i]==f) continue;
		dfs1(to[i],x);
		siz[x]+=siz[to[i]];
		if(siz[to[i]]>siz[son[x]]) son[x]=to[i];
	}
} 

void dfs2(int x,int topf) {
	top[x]=topf;
	id[x]=++cnt;
	if(!son[x]) return ;
	dfs2(son[x],topf);
	for(int i=head[x];i;i=nxt[i]) {
		if(to[i]==fa[x] || to[i]==son[x]) continue;
		dfs2(to[i],to[i]);
	}
}

int n,m;
//查询 
void urang(int x,int y,int k) {
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		update(1,1,n,id[top[x]],id[x],k);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	update(1,1,n,id[x],id[y],k);
}

int qrang(int x,int y) {
	node ans1=(node){0,0,0},ans2=(node){0,0,0},t;
	while(top[x]!=top[y]) {
		if(dep[top[x]]>dep[top[y]]) {
			t=query(1,1,n,id[top[x]],id[x]);
			ans1=(node){ans1.ls,t.ls,t.sum+ans1.sum+(ans1.rs==t.rs)};
			x=fa[top[x]];
		} else {
			t=query(1,1,n,id[top[y]],id[y]);
			ans2=(node){t.ls,ans2.rs,t.sum+ans2.sum+(t.rs==ans1.ls)};
			y=fa[top[y]];
		}
	}
	if(dep[x]>dep[y]) {
			t=query(1,1,n,id[y],id[x]);
			ans1=(node){ans1.ls,t.ls,t.sum+ans1.sum+(ans1.rs==t.rs)}; 
		} else {
			t=query(1,1,n,id[x],id[y]);
			ans2=(node){t.ls,ans2.rs,t.sum+ans2.sum+(t.rs==ans1.ls)};
		}
	return ans1.sum+ans2.sum+(ans1.rs==ans2.ls);
} 

signed main(){
    int t,change=0;
	scanf("%d",&t);
	while(t--) {
		tot=0;cnt=0;change=0;
		memset(head,0,sizeof head);
		memset(to,0,sizeof to);
		memset(nxt,0,sizeof nxt);
		memset(laz,0,sizeof laz);
		memset(dep,0,sizeof dep);
		memset(son,0,sizeof son);
		memset(id,0,sizeof id);
		scanf("%d %d",&n,&m);
		for(int i=1;i<n;i++) {
			int x,y;
			scanf("%d %d",&x,&y);
			add(x,y);add(y,x); 
		}
		dfs1(1,0);
		dfs2(1,1);
		build(1,1,n); 
		for(int i=1;i<=n;i++)update(1,1,n,id[i],id[i],-id[i]);
		for(int i=1;i<=m;i++) {
			int tmp,x,y;
			scanf("%d",&tmp);
			if(tmp==1) {
				scanf("%d %d",&x,&y);
				urang(x,y,++change);
			} else {
				scanf("%d %d",&x,&y);
				printf("%d\n",qrang(x,y));
			}
		}
	}
    return 0;
}
2023/4/10 21:43
加载中...