求助树剖,样例过了TLE0分(已经快调崩溃了)
查看原帖
求助树剖,样例过了TLE0分(已经快调崩溃了)
37885
冷笑叹秋萧楼主2021/7/11 21:18
#include<cstdio>
#include<string>
#include<iostream>
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)<(b))?(a):(b))
#define swap(a,b) a^=b^=a^=b
#define R register int
#define N 30005
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
struct G{int to,next;}e[N<<1];
int n,m,q,dep[N],h[N],a[N],b[N],size[N],top[N],fa[N],cnt,tree[N<<2][2],head[N],dfn[N];
char s[N];
void read(int &x)
{
	x=0;int f=1;char ch=getchar();
	while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();x*=f;
}
void add(int u,int v)
{
	e[++cnt].to=v;e[cnt].next=head[u];
	head[u]=cnt;
}
void dfs1(int u)
{
	size[u]=1;
	for (R i=head[u];i;i=e[i].next)
	{
		int v=e[i].to;if (v==fa[u]) continue;
		fa[v]=u;dep[v]=dep[u]+1;dfs1(v);
		size[u]+=size[v];if (size[v]>size[h[u]]) h[u]=v;
	}
}
void dfs2(int u,int st)
{
	top[u]=st;dfn[u]=++cnt;b[cnt]=a[u];if (!h[u]) return;dfs2(h[u],st);
	for (R i=head[u];i;i=e[i].next)
	{
		int v=e[i].to;if (v==h[u] || v==fa[u]) continue;dfs2(v,v);
	}
}
void build(int u,int l,int r)
{
	if (l==r) {tree[u][0]=tree[u][1]=b[l];return;}
	int mid=l+r>>1;build(u<<1,l,mid);build(u<<1|1,mid+1,r);
	tree[u][0]=tree[u<<1][0]+tree[u<<1|1][0];tree[u][1]=max(tree[u<<1][1],tree[u<<1|1][1]);
}
void change(int u,int l,int r,int k,int x)
{
	if (l==r) {tree[u][0]=tree[u][1]=x;return;}
	int mid=l+r>>1;
	if (k<=mid) change(u<<1,l,mid,k,x);else change(u<<1|1,mid+1,r,k,x);
	tree[u][0]=tree[u<<1][0]+tree[u<<1|1][0];tree[u][1]=max(tree[u<<1][1],tree[u<<1|1][1]);
}
int mx(int u,int l,int r,int x,int y)
{
	if (l>=x && r<=y) return tree[u][1];
	int mid=l+r>>1,res=-inf;
	if (x<=mid) res=max(res,mx(u<<1,l,mid,x,y));if (y>mid) res=max(res,mx(u<<1|1,mid+1,r,x,y));
	return res;
}
int sum(int u,int l,int r,int x,int y)
{
	if (l>=x && r<=y) return tree[u][0];
	int mid=l+r>>1,res=0;
	if (x<=mid) res+=sum(u<<1,l,mid,x,y);if (y>mid) res+=sum(u<<1|1,mid+1,r,x,y);
	return res;
}
int getmx(int x,int y)
{
	int res=-inf;
	while (top[x]!=top[y])
	{
		if (dep[top[x]]<dep[top[y]]) swap(x,y);
		res=max(mx(1,1,n,dfn[top[x]],dfn[x]),res);x=fa[top[x]];
	}
	if (dep[x]>dep[y]) swap(x,y);
	res=max(res,mx(1,1,n,dfn[x],dfn[y]));
	return res;
}
int getsum(int x,int y)
{
	int res=0;
	while (top[x]!=top[y])
	{
		if (dep[top[x]]<dep[top[y]]) swap(x,y);
		res+=sum(1,1,n,dfn[top[x]],dfn[x]);x=fa[top[x]];
	}
	if (dep[x]>dep[y]) swap(x,y);
	res+=sum(1,1,n,dfn[x],dfn[y]);
	return res;
}
int main()
{
	read(n); 
	for (R x,y,i=1;i<n;++i)
	{
		read(x);read(y);
		add(x,y);add(y,x);
	}
	for (R i=1;i<=n;++i)
		read(a[i]);
	cnt=0;dfs1(1);dfs2(1,1);build(1,1,n);
	read(q);
	for (R x,y,i=1;i<=q;++i)
	{
		cin>>s;read(x);read(y);
		if (s[1]=='M') printf("%d\n",getmx(x,y));
		else if (s[1]=='S') printf("%d\n",getsum(x,y));
		else change(1,1,n,dfn[x],y);
	}
	return 0;
}
2021/7/11 21:18
加载中...