TLE 70 求助
查看原帖
TLE 70 求助
556362
Unnamed114514楼主2022/5/3 15:36
#include<bits/stdc++.h>
using namespace std;
int n,q,tot,cnt,h[100005],a[100005],son[100005],w[100005],fa[100005],dep[100005],siz[100005],first[100005],dfn[100005],DFN[100005];
struct ST{
	int l,r,num,add,L,R;
}f[400005];
struct node{
	int v,nxt;
}e[200005];
inline char gc(){
    static char buf[1000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
	int res=0;
	char ch=gc();
	while(ch<'0'||ch>'9')
		ch=gc();
	while(ch>='0'&&ch<='9'){
		res=(res<<1)+(res<<3)+(ch^'0');
		ch=gc();
	}
	return res;
}
void dfs1(int u){
	siz[u]=1;
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v^fa[u]){
			dep[v]=dep[u]+1;
			fa[v]=u;
			siz[u]+=siz[v];
			dfs1(v);
			if(siz[v]>siz[son[u]])
				son[u]=v;
		}
	}
} 
void dfs2(int u,int t){
	dfn[u]=++tot;
	DFN[tot]=u;
	first[u]=t; 
	if(son[u])
		dfs2(son[u],t);
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].v;
		if((v^son[u])&&(v^fa[u]))
			dfs2(v,v);
	}
}
void build(int k,int l,int r){
	f[k].L=l,f[k].R=r;
	if(l==r){
		f[k].l=f[k].r=a[DFN[l]];
		f[k].num=1;
		return;
	}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	f[k].l=f[k<<1].l,f[k].r=f[k<<1|1].r;
	f[k].num=f[k<<1].num+f[k<<1|1].num-(f[k<<1].r==f[k<<1|1].l); 
}
inline void pushdown(int k){
	if(f[k].add){
		f[k<<1].num=f[k<<1|1].num=1;
		f[k<<1].add=f[k<<1|1].add=f[k<<1].l=f[k<<1].r=f[k<<1|1].l=f[k<<1|1].r=f[k].add;
		f[k].add=0;
	}
}
inline int find(int p){
	int k=1;
	while(f[k].L^f[k].R){
		pushdown(k);
		int mid=f[k].L+f[k].R>>1;
		if(p<=mid)
			k=(k<<1);
		else
			k=(k<<1|1);
	}
	return f[k].l;
}
void change(int k,int x,int y,int v){
	if(f[k].add==v)
		return;
	if(x<=f[k].L&&f[k].R<=y){
		f[k].num=1;
		f[k].add=f[k].l=f[k].r=v;
		return;
	}
	pushdown(k);
	int mid=f[k].L+f[k].R>>1;
	if(x<=mid)
		change(k<<1,x,y,v);
	if(y>mid)
		change(k<<1|1,x,y,v);
	f[k].l=f[k<<1].l,f[k].r=f[k<<1|1].r;
	f[k].num=f[k<<1].num+f[k<<1|1].num-(f[k<<1].r==f[k<<1|1].l);
}
int query(int k,int x,int y){
	if(f[k].num==1)
		return 1;
	if(x<=f[k].L&&f[k].R<=y)
		return f[k].num;
	pushdown(k);
	int mid=f[k].L+f[k].R>>1,res=0;
	if(x<=mid)
		res+=query(k<<1,x,y);
	if(y>mid)
		res+=query(k<<1|1,x,y);
	if(x<=mid&&y>mid)
		res-=(f[k<<1].r==f[k<<1|1].l);
	return res;
}
void push(int a,int b,int c){
	int Fa=first[a],fb=first[b];
	while(Fa^fb){
		if(dep[Fa]<dep[fb]){
			a^=b^=a^=b;
			Fa^=fb^=Fa^=fb;
		}
		change(1,dfn[Fa],dfn[a],c);
		a=fa[Fa];
		Fa=first[a];
	}
	if(dep[a]<dep[b])
		a^=b^=a^=b;
	change(1,dfn[b],dfn[a],c);
}
inline int ask(int a,int b){
	int ans=0,l=-1,r=-1,Fa=first[a],fb=first[b];
	while(Fa^fb){
		if(dep[Fa]<dep[fb]){
			l^=r^=l^=r;
			a^=b^=a^=b; 
			Fa^=fb^=Fa^=fb;
		}
		ans+=query(1,dfn[Fa],dfn[a]);
		if(l==find(dfn[a]))
			--ans;
		l=find(dfn[Fa]);
		a=fa[Fa];
		Fa=first[a];
	}
	if(dep[a]<dep[b]){
		l^=r^=l^=r;
		a^=b^=a^=b;
	}
	ans+=query(1,dfn[b],dfn[a]);
	ans-=(l==find(dfn[a]));
	ans-=(r==find(dfn[b]));
	return ans;	
}
inline void add(int u,int v){
	e[++cnt].nxt=h[u];
	h[u]=cnt;
	e[cnt].v=v;
}
int main(){
	n=read(),q=read();
	for(int i=1;i<=n;++i)
		a[i]=read();
	for(int i=1,u,v;i^n;++i){
		u=read(),v=read();
		add(u,v);
		add(v,u); 
	}
	dfs1(1);
	dfs2(1,1);
	build(1,1,n);
	while(q--){
		char ch=gc();
		int a,b,c;
		while(ch!='Q'&&ch!='C')
			ch=gc();
		if(ch^'C'){
			a=read(),b=read();
			printf("%d\n",ask(a,b));
		} else{
			a=read(),b=read(),c=read();
			push(a,b,c);
		}
	}
	return 0;
}
2022/5/3 15:36
加载中...