70pts TLE#13#14#15#16#17#20求调
查看原帖
70pts TLE#13#14#15#16#17#20求调
535369
wangzijie9201楼主2024/11/28 08:41

dalao捞一下吧,实在调不动了

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
#define il inline
int n,m,wo[100001],head[100001],num,f[100001],deep[100001],hs[100001],snum[100001];
int l[100001],h[100001],loc[100001],lw[100001],lnum;
struct map
{
	int cnt;
	int to;
}map[200001];
struct s
{
	int color;
	int l;
	int r;
	int lazy;
}s[400001];
il int read()
{
	int aa=0;
	char ch=0;
	while(ch<48||ch>57)ch=getchar();
	while(ch>=48&&ch<=57)
	{
		aa=(aa<<3)+(aa<<1)+(ch^48);
		ch=getchar();
	}
	return aa;
}
il void write(int aa)
{
	if(aa>=10)write(aa/10);
	putchar(aa%10+48);
	return;
}
il void mbuild(int aa,int bb)
{
	map[++num].to=head[aa];
	head[aa]=num;
	map[num].cnt=bb;
	return;
}
il void dfs1(int root,int depth)
{
	int maxs=-1,maxn=0;
	deep[root]=depth;
	snum[root]=1;
	for(int i=head[root];i!=0;i=map[i].to)
	{
		if(map[i].cnt!=f[root])
		{
			f[map[i].cnt]=root;
			dfs1(map[i].cnt,depth+1);
			snum[root]+=snum[map[i].cnt];
			if(snum[map[i].cnt]>maxs)maxn=map[i].cnt;
		}
	}
	hs[root]=maxn;    
	return;
}
il void dfs2(int aa,int ahead)
{
	l[++lnum]=aa;
	h[aa]=ahead;
	loc[aa]=lnum;
	lw[lnum]=wo[aa];
	if(snum[aa]==1)return;
	dfs2(hs[aa],ahead);
	for(int i=head[aa];i!=0;i=map[i].to)
	{
		if(map[i].cnt!=hs[aa]&&map[i].cnt!=f[aa])dfs2(map[i].cnt,map[i].cnt);
	}
	return;
}
il void sbuild(int l,int r,int aa)
{
	s[aa].l=l;
	s[aa].r=r;
	if(l==r)
	{
		s[aa].color=1;
		return;
	}
	int mid=(l+r)>>1;
	sbuild(l,mid,aa<<1);
	sbuild(mid+1,r,aa<<1|1);
	s[aa].color=s[aa<<1].color+s[aa<<1|1].color-(lw[s[aa<<1].r]==lw[s[aa<<1|1].l]);
	return;
}
il void push_down(int aa)
{
	s[aa<<1].color=1;
	s[aa<<1|1].color=1;
	s[aa<<1].lazy=s[aa].lazy;
	s[aa<<1|1].lazy=s[aa].lazy;
	lw[s[aa<<1].r]=s[aa].lazy;
	lw[s[aa<<1|1].l]=s[aa].lazy;
	s[aa].lazy=0;
	return;
}
il void add(int l,int r,int cc,int aa)
{
	if(s[aa].l>r||s[aa].r<l)return;
	if(s[aa].l>=l&&s[aa].r<=r)
	{
		lw[s[aa].l]=cc;
		lw[s[aa].r]=cc;
		s[aa].lazy=cc;
		s[aa].color=1;
		return;
	}
	if(s[aa].lazy!=0)push_down(aa);
	if(s[aa<<1].r>=l)add(l,r,cc,aa<<1);
	if(s[aa<<1|1].l<=r)add(l,r,cc,aa<<1|1);
	s[aa].color=s[aa<<1].color+s[aa<<1|1].color-(lw[s[aa<<1].r]==lw[s[aa<<1|1].l]);
	return;
}
il int cfind(int l,int r,int aa)
{
	if(s[aa].l>r||s[aa].r<l)return 0;
	if(s[aa].l>=l&&s[aa].r<=r)
	{
		return s[aa].color;
	}
	if(s[aa].lazy!=0)push_down(aa);
	int sum1=0,sum2=0;
	if(s[aa<<1].r>=l)sum1=cfind(l,r,aa<<1);
	if(s[aa<<1|1].l<=r)sum2=cfind(l,r,aa<<1|1);
	if(sum1!=0&&sum2!=0)
	{
		return sum1+sum2-(lw[s[aa<<1].r]==lw[s[aa<<1|1].l]);
	}
	else
	{
		return max(sum1,sum2);
	}
}
il void col(int aa,int bb,int ccc)
{
	if(h[aa]==h[bb])
	{
		if(deep[aa]>deep[bb])add(loc[bb],loc[aa],ccc,1);
		else add(loc[aa],loc[bb],ccc,1);
	}
	else
	{
		if(deep[h[aa]]<deep[h[bb]])swap(aa,bb);
		add(loc[h[aa]],loc[aa],ccc,1);
		col(f[h[aa]],bb,ccc);
	}
	return;
}
il int que(int aa,int bb)
{
	int sum=0;
	if(h[aa]==h[bb])
	{
		if(deep[aa]>deep[bb])sum+=cfind(loc[bb],loc[aa],1);
		else sum+=cfind(loc[aa],loc[bb],1);
	}
	else
	{
		if(deep[h[aa]]<deep[h[bb]])swap(aa,bb);
		sum+=cfind(loc[h[aa]],loc[aa],1);
		sum+=que(f[h[aa]],bb);
		if(lw[loc[h[aa]]]==lw[loc[f[h[aa]]]])--sum;
	}
	return sum;
}
signed main()
{
	n=read();
	m=read();
	for(int i=1;i<=n;++i)
	{
		wo[i]=read();
	}
	for(int i=1;i<n;++i)
	{
		int u,v;
		u=read();
		v=read();
		mbuild(u,v);
		mbuild(v,u);
	}
	dfs1(1,1);
	dfs2(1,1);
	sbuild(1,n,1);
	for(int i=1;i<=m;++i)
	{
		char op;
		cin>>op;
		if(op=='C')
		{
			int a,b,c;
			a=read();
			b=read();
			c=read();
			col(a,b,c);
		}
		else
		{
			int a,b,ans=0;
			a=read();
			b=read();
			ans=que(a,b);
			write(ans);
			putchar(10);
		}
	}
	return 0;
}
2024/11/28 08:41
加载中...