TLE 70 求助
查看原帖
TLE 70 求助
556362
Unnamed114514楼主2022/5/3 20:14
#include<bits/stdc++.h>
using namespace std;
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;
}
struct node{
	int v,nxt;
}e[200005];
int n,q,tot,cnt,lc,rc,h[100005],a[100005],son[100005],w[100005],fa[100005],dep[100005],siz[100005],top[100005],dfn[100005],DFN[100005];
inline void Ins(int u,int v){
	e[++cnt].nxt=h[u];
	h[u]=cnt;
	e[cnt].v=v;
}
struct ST{
	int lc,rc,val,up,l,r;
}f[400005];
inline void down(int k){
	if(f[k].up){
		f[k<<1|1].up=f[k<<1|1].lc=f[k<<1|1].rc=f[k<<1].lc=f[k<<1].rc=f[k<<1].up=f[k].up;
		f[k<<1].val=f[k<<1|1].val=1;
		f[k].up=0;
	}
}
void Build(int k,int l,int r){
	f[k].l=l,f[k].r=r;
	if(l==r){
		f[k].lc=f[k].rc=a[DFN[l]];
		f[k].val=1;
		return;
	}
	int mid=l+r>>1;
	Build(k<<1,l,mid);
	Build(k<<1|1,mid+1,r);
	f[k].lc=f[k<<1].lc,f[k].rc=f[k<<1|1].rc;
	f[k].val=f[k<<1].val+f[k<<1|1].val;
	if(f[k<<1].rc==f[k<<1|1].lc)
		--f[k].val;
}
int Query(int k,int l,int r){
	if(l<=f[k].l&&f[k].r<=r){
		if(l==f[k].l)
			lc=f[k].lc;
		if(r==f[k].r)
			rc=f[k].rc;
		return f[k].val;
	}
	down(k);
	int mid=f[k].l+f[k].r>>1,res=0;
	if(l<=mid)
		res+=Query(k<<1,l,r);
	if(mid<r)
		res+=Query(k<<1|1,l,r);
	if(l<=mid&&mid<r&&f[k<<1].rc==f[k<<1|1].lc)
		--res;
	return res;
}
void Change(int k,int l,int r,int v){
	if(f[k].up==v)
		return;
	if(l<=f[k].l&&f[k].r<=r){
		f[k].val=1;
		f[k].up=f[k].lc=f[k].rc=v;
		return;
	}
	down(k);
	int mid=f[k].l+f[k].r>>1;
	if(l<=mid)
		Change(k<<1,l,r,v);
	if(mid<r)
		Change(k<<1|1,l,r,v);
	f[k].lc=f[k<<1].lc,f[k].rc=f[k<<1|1].rc;
	f[k].val=f[k<<1].val+f[k<<1|1].val;
	if(f[k<<1].rc==f[k<<1|1].lc)
		--f[k].val;
}
void Update(int u,int v,int w){
	while(top[u]^top[v]){
		if(dep[top[u]]<dep[top[v]])
			swap(u,v);
		Change(1,dfn[top[u]],dfn[u],w);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v])
		swap(u,v);
	Change(1,dfn[u],dfn[v],w);
}
inline int Ask(int u,int v){
	int ans=0,p=0,q=0;
	while(top[u]^top[v]){
		if(dep[top[u]]<dep[top[v]]){
			swap(p,q);
			swap(u,v); 
		}
		ans+=Query(1,dfn[top[u]],dfn[u]);
		if(rc==p)
			--ans;
		u=fa[top[u]];
		p=lc;
	}
	if(dep[u]>dep[v]){
		swap(p,q);
		swap(u,v);
	}
	ans+=Query(1,dfn[u],dfn[v]);
	if(p==lc)
		--ans;
	if(q==rc)
		--ans;
	return ans;	
}
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])
			continue;
		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;
	top[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])
			continue;
		dfs2(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();
		Ins(u,v);
		Ins(v,u); 
	}
	dfs1(1);
	dfs2(1,1);
	Build(1,1,n);
	while(q--){
		char ch=gc();
		while(ch!='Q'&&ch!='C')
			ch=gc();
		int a,b,c;
		if(ch^'C'){
			a=read(),b=read();
			printf("%d\n",Ask(a,b));
		} else{
			a=read(),b=read(),c=read();
			Update(a,b,c);
		}
	}
	return 0;
}
2022/5/3 20:14
加载中...