求助,样例与讨论版中的hack过了,其他全WA
查看原帖
求助,样例与讨论版中的hack过了,其他全WA
669329
deyi楼主2024/5/30 18:35
#include<bits/stdc++.h>
using namespace std;
int size[100010], tp[100010], pos[100010], n, m, fa[100010], len=1, deep[100010], cnt, mp[100010], a[100010], mark[400010];
vector<int>e[100010];
struct node{
	int l, r, sum;
}tr[400010];
void dfs1(int x){
	size[x]=1;
	for(auto v:e[x]){
		if(v==fa[x])continue;
		fa[v]=x;
		deep[v]=deep[x]+1;
		dfs1(v);
		size[x]+=size[v];
	}
}
void dfs2(int x){ 
	mp[x]=++cnt;
	int maxn=0, p=0;
	for(auto v:e[x]){
		if(v==fa[x])continue;
		if(size[v]>maxn){
			p=v;
			maxn=size[v];
		}
	}
	if(!p)return;
	pos[p]=pos[x];
	dfs2(p);
	for(auto v:e[x]){
		if(v==fa[x]||v==p)continue;
		pos[v]=++len,tp[len]=v;
		dfs2(v);
	}
}
void push(int pos, long long l, long long r, int ll, int rr, long long x){
	if(l>rr||r<ll)return;
	if(l>=ll&&r<=rr){
		tr[pos].l=tr[pos].r=x;
		tr[pos].sum=1;
		mark[pos]=x;
		return;
	}
	int mid=(l+r)/2;
	if(mark[pos]){
		tr[pos*2].l=tr[pos*2].r=tr[pos*2+1].l=tr[pos*2+1].r=mark[pos];
		tr[pos*2].sum=tr[pos*2+1].sum=1;
	}
	mark[pos]=0;
	push(pos*2,l,mid,ll,rr,x);
	push(pos*2+1,mid+1,r,ll,rr,x);
	tr[pos].l=tr[pos*2].l;
	tr[pos].r=tr[pos*2+1].r;
	tr[pos].sum=tr[pos*2].sum+tr[pos*2+1].sum;
	if(tr[pos*2].r==tr[pos*2+1].l&&tr[pos*2].r)tr[pos].sum--;
}
node pop(int pos, int l, int r, int ll, int rr){
	if(l>rr||r<ll)return node{0,0,0};
	if(l>=ll&&r<=rr){
	//	cout<<tr[pos].l<<endl;
		return tr[pos];
	}
	int mid=(l+r)/2;
	if(mark[pos]){
		tr[pos*2].l=tr[pos*2].r=tr[pos*2+1].l=tr[pos*2+1].r=mark[pos];
		tr[pos*2].sum=tr[pos*2+1].sum=1;
	}
	mark[pos]=0;
	node x=pop(pos*2,l,mid,ll,rr);
	node y=pop(pos*2+1,mid+1,r,ll,rr);
	node z;
	if(x.sum&&y.sum){
		z.l=x.l,z.r=y.r;
	}
	else{
		if(x.sum)z.l=x.l,z.r=x.r;
		else z.l=y.l, z.r=y.r;
	}
	z.sum=x.sum+y.sum;
	if(x.r==y.l&&x.r)z.sum--;
	return z;
}
void add(int x, int y, int z){
	while(pos[x]!=pos[y]){
		if(deep[tp[pos[x]]]<deep[tp[pos[y]]])swap(x,y);
		push(1,1,n,mp[tp[pos[x]]],mp[x],z);
		x=fa[tp[pos[x]]];
	}
	if(deep[x]<deep[y])swap(x,y);
	push(1,1,n,mp[y],mp[x],z);
}
int SUM(int x, int y){
	int ans=0, last1=0, last2=0;
	while(pos[x]!=pos[y]){
		if(deep[tp[pos[x]]]<deep[tp[pos[y]]])swap(x,y),swap(last1,last2);
		node sum=pop(1,1,n,mp[tp[pos[x]]],mp[x]);
		if(sum.r==last1)ans--;
		last1=sum.l;
		ans+=sum.sum;
	//	cout<<ans<<endl;
		x=fa[tp[pos[x]]];
	}
	if(deep[x]<deep[y])swap(x,y),swap(last1,last2);
	node sum=pop(1,1,n,mp[y],mp[x]);
	ans+=sum.sum;
	if(sum.r==last1)ans--;  
    if(sum.l==last2)ans--;  
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<n;i++){
		int x, y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	deep[1]=1;dfs1(1);pos[1]=1;tp[1]=1;dfs2(1);
	for(int i=1;i<=n;i++)add(i,i,a[i]);
	while(m--){
		char op;
		int x, y, z;
		cin>>op;
		if(op=='C'){
			cin>>x>>y>>z;
			add(x,y,z);
		}
		if(op=='Q'){
			cin>>x>>y;
			cout<<SUM(x,y)<<endl;
		}
	}
    return 0;
}
/*
3 1000
1 1 2
1 2
1 3
Q 1 3
C 1 1 2
Q 2 3
*/
2024/5/30 18:35
加载中...