能过样例,全WA,树剖,求助
查看原帖
能过样例,全WA,树剖,求助
420505
A_sh楼主2021/10/31 16:53

RT;

尽己所能调了;

请不吐槽变量名/码风(我是异端)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define bug cout<<"error"<<"\n";
#define inf -0x7f7f7f7f
const int N=1e6+10;
ll m,n,s;
struct node {
	int l,r;
	ll dat,rmq;
} t[N<<2];
int top[N],dep[N],siz[N],son[N],f[N],id[N];
ll w[N],sw[N];
int v[N<<1],ne[N<<1],h[N];
ll ans,cnt,tot,tim;
void add(int x,int y) {
	v[++cnt]=y,ne[cnt]=h[x],h[x]=cnt;
}
int max(int a,int b) {
	return a>b?a:b;
}
void pushup(int p) {
	t[p].rmq=max(t[p<<1].rmq,t[p<<1|1].rmq);
	t[p].dat=t[p<<1].dat+t[p<<1|1].dat;
}
void build(int p,int l,int r) {
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].dat=t[p].rmq=sw[l];
		return;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
	return;
}
void update(int p,int x,ll ad) {
	if(t[p].l==t[p].r&&t[p].l==x){
		t[p].dat=t[p].rmq=ad;
		return;
	}
	int mid=t[p].l+t[p].r>>1;
	if(x<=mid)update(p<<1,x,ad);
	else update(p<<1|1,x,ad);
	pushup(p);
}
ll query(int p,int l,int r) {
	if(l<=t[p].l&&r>=t[p].r)return t[p].dat;
	ll sum=0;
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid)sum+=query(p<<1,l,r);
	if(r>mid)sum+=query(p<<1|1,l,r);
	return sum;
}
ll query1(int p,int l,int r) {
	if(l<=t[p].l&&r>=t[p].r)return t[p].rmq;
	ll sum=inf;
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid)sum=max(sum,query1(p<<1,l,r));
	if(r>mid)sum=max(sum,query1(p<<1|1,l,r));
	return sum;
}
void dfs1(int x,int fa) {
	dep[x]=dep[fa]+1;
	f[x]=fa;
	siz[x]=1;
	for(int i=h[x];i;i=ne[i]){
		int y=v[i];
		if(y!=fa){
			dfs1(y,x);
			siz[x]+=siz[y];
			if(siz[y]>siz[son[x]])son[x]=y;
		}
	}
}
void dfs2(int x,int tp) {
	top[x]=tp;
	id[x]=++tim;
	sw[tim]=w[x];
	if(!son[x])return;
	dfs2(son[x],tp);
	for(int i=h[x]; i; i=ne[i]) {
		int y=v[i];
		if(y!=f[x]&&y!=son[x])dfs2(y,y);
	}
}
ll qsum(int x,int y) {
	ll res=0;
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		res+=query(1,id[top[x]],id[x]);
		x=f[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	res+=query(1,id[x],id[y]);
	return res;
}
ll qrmq(int x,int y) {
	ll res=inf;
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		res=max(res,query1(1,id[top[x]],id[x]));
		x=f[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	res=max(res,query1(1,id[x],id[y]));
	return res;
}
ll qr() {
	ll res=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch)) {
		res=(res<<1)+(res<<3)+(ch^48);
		ch=getchar();
	}
	return res;
}
signed main() {
	n=qr();
	ll x,y;

	for(int i=1; i<n; i++) {
		x=qr(),y=qr();
		add(x,y);
		add(y,x);
	}
	for(int i=1; i<=n; i++)w[i]=qr();
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	m=qr();
	while(m--) {
		string c;
		cin >> c;
		scanf("%lld%lld",&x,&y);
		if(c[0]=='C')update(1,id[x],y);
		else if(c[1]=='M')printf("%lld\n",qrmq(x,y));
		else if(c[1]=='S')printf("%lld\n",qsum(x,y));
	}
	return 0;
}
2021/10/31 16:53
加载中...