蒟蒻求救,TLE&WA
查看原帖
蒟蒻求救,TLE&WA
783336
Earth_Sky楼主2024/5/31 13:18
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+5,INF=2e9+7;
int n,q,a[4*MAX];
int h[MAX],u[MAX],v[MAX],ne[MAX],tot;
int tpos[MAX],pre[MAX],cnt;
int size[MAX],wson[MAX],top[MAX],fa[MAX],d[MAX];
void add(int x,int y){
	u[++tot]=x;v[tot]=y;
	ne[tot]=h[x];h[x]=tot;
}
void dfs1(int x,int f){
	size[x]=1;
	for(int i=h[x];i!=-1;i=ne[i]){
		int y=v[i];if(y==f) continue;
		d[y]=d[y]+1;fa[y]=x;dfs1(y,x);
		size[x]+=size[y];
		if(size[y]>size[wson[x]]) wson[x]=y;
	}
}
void dfs2(int x,int tp){
	tpos[x]=++cnt;pre[cnt]=x;top[x]=tp;
	if(wson[x]) dfs2(wson[x],tp);
	for(int i=h[x];i!=-1;i=ne[i]){
		int y=v[i];
		if(y==fa[x]||y==wson[x]) continue;
		dfs2(y,y);
	}
}
int sumv[MAX<<2],maxv[MAX<<2];
void pushup(int o){
	sumv[o]=sumv[o*2]+sumv[o*2+1];
	maxv[o]=max(maxv[o*2],maxv[o*2+1]);
}
void build(int o,int l,int r){
	int mid=l+r>>1;
	if(l==r){sumv[o]=maxv[o]=a[pre[l]];return;}
	build(o*2,l,mid);build(o*2+1,mid+1,r);
	pushup(o);
}
void update(int o,int l,int r,int q,int v){
	int mid=l+r>>1;
	if(l==r){sumv[o]=maxv[o]=v;return;}
	if(q<=mid) update(o*2,l,mid,q,v);
	else update(o*2+1,mid+1,r,q,v);
	pushup(o);
}
int querysum(int o,int l,int r,int ql,int qr){
	int mid=l+r>>1,ans=0;
	if(ql<=l&&r<=qr) return sumv[o];
	if(ql<=mid) ans+=querysum(o*2,l,mid,ql,qr);
	if(qr>mid) ans+=querysum(o*2+1,mid+1,r,ql,qr);
	return ans;
} 
int querymax(int o,int l,int r,int ql,int qr){
	int mid=l+r>>1,ans=-INF;
	if(ql<=l&&r<=qr) return maxv[o];
	if(ql<=mid) ans=max(ans,querymax(o*2,l,mid,ql,qr));
	if(qr>mid) ans=max(ans,querymax(o*2+1,mid+1,r,ql,qr));
	return ans;
}
int qsum(int u,int v){
	int ans=0;
	while(top[u]!=top[v]){
		if(d[top[u]]<d[top[v]]) swap(u,v);
		ans+=querysum(1,1,n,tpos[top[u]],tpos[u]);
		u=fa[top[u]];
	}
	if(d[u]<d[v]) swap(u,v);
	ans+=querysum(1,1,n,tpos[v],tpos[u]);
	return ans;
}
int qmax(int u,int v){
	int ans=-INF;
	while(top[u]!=top[v]){
		if(d[top[u]]<d[top[v]]) swap(u,v);
		ans=max(ans,querymax(1,1,n,tpos[top[u]],tpos[u]));
		u=fa[top[u]];
	}
	if(d[u]<d[v]) swap(u,v);
	ans=max(ans,querymax(1,1,n,tpos[v],tpos[u]));
	return ans;
}
int main(){
	ios::sync_with_stdio(NULL);
	cin.tie(0);cout.tie(0);
	memset(h,-1,sizeof h);
	cin>>n;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);add(v,u);
	}
	for(int i=1;i<=n;i++) cin>>a[i];
	d[1]=fa[1]=1;dfs1(1,-1);dfs2(1,1);build(1,1,n);
	cin>>q;
	while(q--){
		int x,y;
		char s[10];
		cin>>s>>x>>y;
		if(s[1]=='H') update(1,1,n,tpos[x],y);
		if(s[1]=='M') cout<<qmax(x,y)<<endl;
		if(s[1]=='S') cout<<qsum(x,y)<<endl;
	}

	return 0;
}

如题

2024/5/31 13:18
加载中...