求助
查看原帖
求助
25001
Pro_Rexxar楼主2020/10/22 21:00

不知道为什么TLE+RE

#include <bits/stdc++.h>
#define MAXN 100007
using namespace std;
struct node{int l,r,w,m;}t[MAXN*4];
int n,m,cnt,num,a[MAXN],nxt[MAXN*2],lst[MAXN*2],edge[MAXN],size[MAXN],deep[MAXN],son[MAXN],fa[MAXN],id[MAXN],di[MAXN],top[MAXN];
inline int read()
{
	int s=0,w=1; char c=getchar();
	for (;!isdigit(c);c=getchar()) if (c=='-') w=-1;
	for (; isdigit(c);c=getchar()) s=(s<<3)+(s<<1)+c^48;
	return (s*w);
}
void add(int x,int y) {nxt[++cnt]=x; lst[cnt]=edge[y]; edge[y]=cnt;}
void dfs1(int k)
{
	size[k]=1;
	for (int i=edge[k];i;i=lst[i])
	{
		int now=nxt[i];
		if (now==fa[k]) continue;
		fa[now]=k;
		deep[now]=deep[k]+1;
		dfs1(now);
		size[k]=size[k]+size[now];
		if (size[now]>size[son[k]]) son[k]=now;
	}
}
void dfs2(int k,int faa)
{
	top[k]=faa;
	id[k]=++num;
	di[num]=k;
	if (son[k]) dfs2(son[k],faa);
	for (int i=edge[k];i;i=lst[i])
	{
		int now=nxt[i];
		if (now==fa[k]||now==son[k]) continue;
		dfs2(now,now);
	}
}
void build(int k,int l,int r)
{
	t[k].l=l,t[k].r=r;
	if (l==r) {t[k].w=t[k].m=a[di[l]]; return;}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	t[k].w=t[k<<1].w+t[k<<1|1].w;
	t[k].m=max(t[k<<1].m,t[k<<1|1].m);
}
void change(int k,int w,int v)
{
	if (t[k].l==t[k].r) {t[k].w=t[k].m=v; return;}
	int mid=(t[k].l+t[k].r)>>1;
	if (w<=mid) change(k<<1,w,v);
	if (w>=mid+1) change(k<<1|1,w,v);
	t[k].w=t[k<<1].w+t[k<<1|1].w;
	t[k].m=max(t[k<<1].m,t[k<<1|1].m);
}
int querys(int k,int l,int r)
{
	if (l<=t[k].l&&t[k].r<=r) return(t[k].w);
	int mid=(t[k].l+t[k].r)>>1;
	int anss=0;
	if (l<=mid) anss=anss+querys(k<<1,l,r);
	if (r>=mid+1) anss=anss+querys(k<<1|1,l,r);
	return anss;
}
int querym(int k,int l,int r)
{
	if (l<=t[k].l&&t[k].r<=r) return(t[k].m);
	int mid=(t[k].l+t[k].r)>>1;
	int anss=-300005;
	if (l<=mid) anss=max(anss,querym(k<<1,l,r));
	if (r>=mid+1) anss=max(anss,querym(k<<1|1,l,r));
	return anss;
}
int main()
{
	n=read();
	for (int i=1;i<=n-1;i++)
	{
		int x=read(),y=read();
		add(x,y);
		add(y,x);
	}
	for (int i=1;i<=n;i++) a[i]=read();
	dfs1(1);
	dfs2(1,1);
	build(1,1,n);
	m=read();
	for (int i=1;i<=m;i++)
	{
		char s[10];
      	int x,y;
      	scanf("%s%d%d",s,&x,&y);
		if (s[0]=='C') change(1,id[x],y);
		if (s[1]=='M')
		{
			int ans=-300005;
			while (top[x]!=top[y])
			{
				if (deep[top[x]]<deep[top[y]]) swap(x,y);
				ans=max(ans,querym(1,id[top[x]],id[x]));
				x=fa[top[x]];
			}
			if (deep[x]>deep[y]) swap(x,y);
			ans=max(ans,querym(1,id[x],id[y]));
			printf("%d\n",ans);
		}
		if (s[1]=='S')
		{
			int ans=0;
			while (top[x]!=top[y])
			{
				if (deep[top[x]]<deep[top[y]]) swap(x,y);
				ans=ans+querys(1,id[top[x]],id[x]);
				x=fa[top[x]];
			}
			if (deep[x]>deep[y]) swap(x,y);
			ans=ans+querys(1,id[x],id[y]);
			printf("%d\n",ans);
		}
	}
	return 0;
}
2020/10/22 21:00
加载中...