求助 20分 其他wa
查看原帖
求助 20分 其他wa
141335
qwq2519楼主2020/10/12 21:59
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i!=(k+1);++i)
using namespace std;
typedef long long ll;
const int N=3e5+7;
inline void read(int &x)
{
	x=0;register char ch=getchar();
	int w=0;
	while (ch>'9'||ch<'0'){
		w|=ch=='-';ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-48;
		ch=getchar();
	}
	w?x=~(x-1):x;
}
//inline void swap(int &a,int &b)
//{
//	a==b? 1:a^=b^=a^=b;
//}
inline void out(int x) {
	if(x<0) x=-x,putchar('-');
	if(x==0) {
		putchar('0'),putchar('\n');
		return ;
	}
	if(x<10) {
		putchar(x+48);
		putchar('\n');
		return ;
	}
	char ch[50];
	int num(0);
	while(x) {
		ch[++num]=x%10+48;
		x/=10;
	}
	while(num) putchar(ch[num--]);
	putchar('\n');
}

struct graph {
	int head[N<<1],next[N<<1],tot,ver[N<<1];
	inline void add(int a,int b) {
		ver[++tot]=b;
		next[tot]=head[a];
		head[a]=tot;
	}
} G;

int n,q;
int a[N],b[N];
int son[N<<1],dfn[N<<1],fa[N<<1],num;
int dep[N<<1],size[N<<1],top[N<<1];

inline void dfs1(int x,int fath)
{
	dep[x]=dep[fath]+1;
	fa[x]=fath;
	size[x]=1;
	int maxson=-1;
	for (register int i(G.head[x]);i;i=G.next[i])
	{
		int y(G.ver[i]);
		if(y==fath) continue;
		dfs1(y,x);
		size[x]+=size[y];
		if(size[y]>maxson) maxson=size[y],son[x]=y;
	}
}

inline void dfs2(int x,int topf)
{
	dfn[x]=++num;
	a[num]=b[x];
	top[x]=topf;
	if(!son[x]) return;
	dfs2(son[x],topf);
	for(register int i(G.head[x]);i;i=G.next[i]){
		int y(G.ver[i]);
		if(dfn[y]) continue;
		dfs2(y,y);
	}
}

inline int max(int &x,int &y){
	return x>y? x:y;
}
struct Segmentree{
	int lc[N<<1],rc[N<<1],root,cnt,maxx[N<<1];
	ll sum[N<<1];
	inline void insert(int &p,int L,int R,int x,int v)
	{
		if(!p) p=++cnt;
		if(L==R)
		{
			sum[p]=v;
			maxx[p]=v;
			return ;
		}
		int mid((L+R)>>1);
		if(x<=mid) insert(lc[p],L,mid,x,v);
		else insert(rc[p],mid+1,R,x,v);
		maxx[p]=max(maxx[lc[p]],maxx[rc[p]]);
		sum[p]=sum[lc[p]]+sum[rc[p]];
	}
	inline int qmax(int p,int L,int R,int ll,int rr)
	{
		if(!p) return -2147483;
		if(ll<=L&&rr>=R)
			return maxx[p];
		int mid=((L+R)>>1);
		int val=-3e4-5;
		if(ll<=mid) val=max(val,qmax(lc[p],L,mid,ll,rr));
		if(rr>mid) val=max(val,qmax(rc[p],mid+1,R,ll,rr));
		return val;
	}
	inline ll qsum(int p,int L,int R,int ll,int rr)
	{
		if(!p) return 0;
		if(ll<=L&&rr>=R)
			return sum[p];
		int mid((L+R)>>1);
		int val(0);
		if(ll<=mid) val+=qsum(lc[p],L,mid,ll,rr);
		if(rr>mid) val+=qsum(rc[p],mid+1,R,ll,rr);
		return val;
	}
	
}S;
inline ll qsmchain(int x,int y){
	ll ans(0);
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans+=S.qsum(S.root,1,n,dfn[top[x]],dfn[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans+=S.qsum(S.root,1,n,dfn[x],dfn[y]);
	return ans;
}

inline int qmxchain(int x,int y)
{
	int ans(-3e4);
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ans=max(ans,S.qmax(S.root,1,n,dfn[top[x]],dfn[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	ans=max(ans,S.qmax(S.root,1,n,dfn[x],dfn[y]));
	return ans;
}

int main()
{
	int aa,bb;
	read(n);
	rep(i,1,n-1)
	{
		read(aa);read(bb);
		G.add(aa,bb);
		G.add(bb,aa);
	}
	rep(i,1,n) read(b[i]);
	dfs1(1,0);
	dfs2(1,1);
	rep(i,1,n) S.insert(S.root,1,n,i,a[i]);
	read(q);
	string op;
	int x,y;
	while(q--)
	{
		cin>>op>>x>>y;
		if(op=="CHANGE"){
			S.insert(S.root,1,n,x,y);
		}
		else if(op=="QMAX")
		{
		    out(qmxchain(x,y));
		}
		else if(op=="QSUM")
		{
			cout<<qsmchain(x,y)<<endl;
//			out(qsmchain(x,y));
		}
	}
	return 0;
}

/*
4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4
*/

调数据结构,白了少年头

2020/10/12 21:59
加载中...