求助树剖
查看原帖
求助树剖
105833
樱洛CHANGE楼主2021/5/13 16:44

五个RE,两个MLE。。。 貌似我的线段树空间比较大。。。 但是感觉没啥可以去掉的数组。。。。

#include<bits/stdc++.h>
//#define zhale exit(0)
//#define Freopen
//#define Clock

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double qwq;
typedef pair<ll,ll> llP;

template<class T>
void Swap(T &x,T &y)
{
    T z=x;
    x=y;
    y=z;
}

template<class T>
T Read() 
{ 
    T x=0,f=1; 
    char ch=getchar(); 
    while(ch<'0'||ch>'9') 
    { 
        if(ch=='-') 
        f=-1; 
        ch=getchar(); 
    } 
    while(ch>='0'&&ch<='9') 
    { 
        x=(x<<1)+(x<<3)+(ch^'0'); 
        ch=getchar(); 
    } 
    return x*f; 
} 
int (*read)()=Read<int>;
ll (*readll)()=Read<ll>;

const int N=3e4+5;

int n,q;
int ver[N],head[N],nxt[N],w[N],tot;
int a[N];
class SMT{
	struct Node{
		int l,r,mx,sum;
	}T[N<<2];
	public:
		void build(int p,int l,int r){
			T[p].l=l,T[p].r=r;
			if(T[p].l==T[p].r)
			{
				T[p].mx=T[p].sum=w[a[l]];
				return ;
			}
			int mid=l+(r-l>>1);
			build(p*2,l,mid);
			build(p*2+1,mid+1,r);
			T[p].sum=T[p*2].sum+T[p*2+1].sum;
			T[p].mx=max(T[p*2].mx,T[p*2+1].mx);
		}
		void change(int p,int x,int k){
			if(T[p].l==T[p].r)
			{
				T[p].sum=T[p].mx=k;
				return ;
			}
			int mid=T[p].l+(T[p].r-T[p].l>>1);
			if(x<=mid)
			change(p*2,x,k);
			else
			change(p*2+1,x,k);
			T[p].sum=T[p*2].sum+T[p*2+1].sum;
			T[p].mx=max(T[p*2].mx,T[p*2+1].mx);
		}
		int getmax(int p,int l,int r){
			if(T[p].l>=l&&T[p].r<=r)
			return T[p].mx;
			int mid=T[p].l+(T[p].r-T[p].l>>1),val=-(1<<30);
			if(l<=mid)
			val=max(val,getmax(p*2,l,r));
			if(r>mid)
			val=max(val,getmax(p*2+1,l,r));
			return val;
		}
		int getsum(int p,int l,int r)
		{
			if(T[p].l>=l&&T[p].r<=r)
			return T[p].sum;
			int mid=T[p].l+(T[p].r-T[p].l>>1),val=0;
			if(l<=mid)
			val+=getsum(p*2,l,r);
			if(r>mid)
			val+=getsum(p*2+1,l,r);
			return val;
		}
}t;

void add(int x,int y)
{
	ver[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}

int d[N],hyson[N],fa[N],sz[N],id[N],top[N],cnt;

void dfs1(int x,int f)
{
	sz[x]=1;
	int szmx=-1;
	for(int i=head[x];i;i=nxt[i])
	{
		int y=ver[i];
		if(d[y]||y==f)
		continue;
		d[y]=d[x]+1;
		fa[y]=x;
		dfs1(y,x);
		sz[x]+=sz[y];
		if(sz[y]>szmx)
		hyson[x]=y,szmx=sz[y];
	}
}

void dfs2(int x,int xtop)
{
	id[x]=++cnt;
	a[cnt]=x;
	top[x]=xtop;
	if(hyson[x])
	dfs2(hyson[x],xtop);
	for(int i=head[x];i;i=nxt[i])
	{
		int y=ver[i];
		if(y!=fa[x]&&y!=hyson[x])
		dfs2(y,y);
	}
}

int qmax(int x,int y)
{
	int val=-(1<<30);
	while(top[x]!=top[y])
	{		
		if(d[top[x]]<d[top[y]])
		Swap(x,y);
		val=max(val,t.getmax(1,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(d[x]>d[y])
	Swap(x,y);
	return val=max(val,t.getmax(1,id[x],id[y]));
}

int qsum(int x,int y)
{
	int val=0;
	while(top[x]!=top[y])
	{		
		if(d[top[x]]<d[top[y]])
		Swap(x,y);
		val+=t.getsum(1,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(d[x]>d[y])
	Swap(x,y);
	return val+=t.getsum(1,id[x],id[y]);
}

inline int True()
{
#ifdef Freopen
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
#endif

#ifdef Clock
	int STR=clock();
#endif
	
	n=read();
	for(int i=1;i<n;++i)
	{
		int x=read(),y=read();
		add(x,y);
		add(y,x);
	}
	for(int i=1;i<=n;++i)
	w[i]=read();
	dfs1(1,0);
	dfs2(1,1);
	t.build(1,1,n);
	q=read();
	for(int i=1;i<=q;++i)
	{
		char ch[10];
		cin>>ch;
		if(ch[1]=='H')
		{
			int x=read(),k=read();
			t.change(1,id[x],k);
		}
		else if(ch[1]=='M')
		{
			int x=read(),y=read();
			printf("%d\n",qmax(x,y));
		}
		else
		{
			int x=read(),y=read();
			printf("%d\n",qsum(x,y));
		}
	}
	
#ifdef Clock
	int END=clock();
	printf("Time: %dms\n",int((END-STR)/(qwq)CLOCKS_PER_SEC*1000));
	printf("Time: %ds\n",int((END-STR)/(qwq)CLOCKS_PER_SEC));
#endif
	return (0-0);//q(0-0)p q(>-<)p
}

int Love=True();

int main(){;}
2021/5/13 16:44
加载中...