AC on 5,6,9 但是貌似不同于其他警示帖?
查看原帖
AC on 5,6,9 但是貌似不同于其他警示帖?
813622
Igallta楼主2023/11/16 16:16
#include<bits/stdc++.h>
#define int long long
#define LL k<<1
#define RR k<<1|1
#define cur vec[x][i]
using namespace std;
const int N=1e6+1;
vector<int>vec[N];
int son[N],fa[N],n,top[N],l[N],dep[N],rmax,rsum,size[N],b[N],a[N];//son:重儿子 top:链根 l:DFS序 dep:深度 b:下标
set<int>st[N];
struct Node{
	int sum,maxn,l,r;
}t[4*N];
inline void pushup(int k){t[k].sum=t[LL].sum+t[RR].sum;t[k].maxn=max(t[LL].maxn,t[RR].maxn);}
inline void build(int k,int l,int r){
	t[k].l=l;
	t[k].r=r;
	if(l==r){
		t[k].sum=a[l];
		t[k].maxn=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(LL,l,mid);
	build(RR,mid+1,r);
	pushup(k);
}
inline void querymax(int k,int l,int r){//t[k].l t[k].r 所在区间  l r 查询 
	if(t[k].l <= r && t[k].r >= l){//在区间里面
		//全覆盖
		if(l<=t[k].l && r>=t[k].r){
			rmax=max(rmax,t[k].maxn);
			return;
		}
		int mid=(t[k].l+t[k].r)>>1;
		if(mid >= l){
			querymax(LL,l,r);
		}
		if(mid < r){
			querymax(RR,l,r);
		}
	}
}
inline void querysum(int k,int l,int r){
	if(t[k].l <= r && t[k].r >= l){//在区间里面
		//全覆盖
		if(l<=t[k].l && r>=t[k].r){
			rsum+=t[k].sum;
			return;
		}
		int mid=(t[k].l+t[k].r)>>1;
		if(mid >= l){
			querysum(LL,l,r);
		}
		if(mid < r){
			querysum(RR,l,r);
		}
	}
}
inline void update(int k,int u,int v){
	if(t[k].l <= u && t[k].r >= u){
		if(t[k].l == t[k].r){
			t[k].sum=v;
			t[k].maxn=v;
			return;
		}
		int mid=(t[k].l+t[k].r)>>1;
		if(mid >= u){
			update(LL,u,v);
		}
		if(mid < u){
			update(RR,u,v);
		}
		pushup(k);
	}
}
inline void dfspt1(int x) {
	size[x]=1;
	for(int i=0; i<vec[x].size(); i++) {
		if(cur != fa[x]) {
			dep[cur]=dep[x]+1,fa[cur]=x;
			dfspt1(cur),size[x]+=size[cur];
			if(size[cur] > size[son[x]])son[x]=cur;
		}
	}
}
int tot;
inline void dfspt2(int x,int t) {
	l[x]=++tot;
	a[tot]=b[x];
	top[x]=t;
	if(son[x])dfspt2(son[x],t);
	for(int i=0; i<vec[x].size(); i++) {
		if(cur!=fa[x]&&cur!=son[x]) {
			dfspt2(cur,cur);
		}
	}
}
inline int fmax(int a,int b){
	int maxn=-2147483647ll;
	while(top[a]!=top[b]){
		if(dep[top[a]] < dep[top[b]]){
			swap(a,b);
		}
//		cout<<a<<' '<<b<<'\n';
		rmax=-2147483647ll;
		querymax(1,l[top[a]],l[a]);
		maxn=max(maxn,rmax);
		a=fa[top[a]];
	}
	if(dep[a]>dep[b])swap(a,b);
	rmax=-2147483647ll;
	querymax(1,l[a],l[b]);
	maxn=max(maxn,rmax);
	return maxn;
}
inline int fsum(int a,int b){
	int sum=0;
	while(top[a] != top[b]){
		if(dep[top[a]] < dep[top[b]])swap(a,b);
		rsum=0;
		querysum(1,l[top[a]],l[a]);
		sum+=rsum;
		a=fa[top[a]];
	}
	if(dep[a] > dep[b])swap(a,b);
	rsum=0;
	querysum(1,l[a],l[b]);
	sum+=rsum;
	return sum;
}
signed main() {
	cin>>n;
	for(int i=1;i<=n-1;i++){
		int u,v;
		cin>>u>>v;
		vec[u].push_back(v);
		vec[v].push_back(u);
	}
	for(int i=1;i<=n;i++)cin>>b[i];
	dfspt1(1);
	dfspt2(1,1);
	build(1,1,n);
	int Q;
	cin>>Q;
	while(Q--){
		string s;
		int lx,r;
		cin>>s>>lx>>r;
		if(s=="QMAX"){
			cout<<fmax(lx,r)<<'\n';
		}	
		if(s=="QSUM"){
			cout<<fsum(lx,r)<<'\n';
		}
		if(s=="CHANGE"){
			update(1,lx,r);
		}
	}
	return 0;
}
2023/11/16 16:16
加载中...