WA 40 分求助(树剖+线段树)
查看原帖
WA 40 分求助(树剖+线段树)
571147
zhlzt楼主2024/9/5 21:55

WA 2,3,4,6,9,10,AC 1,5,7,8。

#include<bits/stdc++.h>
using namespace std;
typedef int t;
const int maxn=1e5+10;
int sum[maxn<<6],maxi[maxn<<6];
int pls[maxn<<6],prs[maxn<<6],cnt;
int rate[maxn],bel[maxn],n,q;
int head[maxn],fath[maxn],son[maxn],dep[maxn];
int dfn[maxn],siz[maxn],root[maxn],id;
vector<int>edge[maxn];
inline void pushup(t p){
	sum[p]=sum[pls[p]]+sum[prs[p]];
	maxi[p]=max(maxi[pls[p]],maxi[prs[p]]);
	return;
}
inline void update(t d,t &p,t pl,t pr,t k){
	if(!p) p=++cnt;
	if(pl==pr){sum[p]=maxi[p]=k;return;}
	int mid=(pl+pr)>>1;
	if(d<=mid) update(d,pls[p],pl,mid,k);
	else update(d,prs[p],mid+1,pr,k);
	return pushup(p);
}
inline t querymax(t l,t r,t p,t pl,t pr){
	if(!p) return 0;
	if(l<=pl and pr<=r) return maxi[p];
	int mid=(pl+pr)>>1,ans=0;
	if(l<=mid) ans=max(ans,querymax(l,r,pls[p],pl,mid));
	if(r>mid) ans=max(ans,querymax(l,r,prs[p],mid+1,pr));
	return ans;
}
inline t querysum(t l,t r,t p,t pl,t pr){
	if(!p) return 0;
	if(l<=pl and pr<=r) return sum[p];
	int mid=(pl+pr)>>1,ans=0;
	if(l<=mid) ans+=querysum(l,r,pls[p],pl,mid);
	if(r>mid) ans+=querysum(l,r,prs[p],mid+1,pr);
	return ans;
} 
inline void dfs1(t u,t dad){
	fath[u]=dad; siz[u]=1;
	dep[u]=dep[dad]+1;
	for(int v:edge[u]){
		if(v==dad) continue;
		dfs1(v,u); siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v;
	}
	return;
}
inline void dfs2(t u,t hd){
	head[u]=hd; dfn[u]=++id;
	if(son[u]) dfs2(son[u],hd);
	for(int v:edge[u]){
		if(v!=son[u] and v!=fath[u]) dfs2(v,v);
	}
	return;
}
inline t qrysum(t u,t v,t k){
	int ans=0;
	while(head[u]!=head[v]){
		if(dep[head[u]]<dep[head[v]]) swap(u,v);
		ans+=querysum(dfn[head[u]],dfn[u],root[k],1,n);
		u=fath[head[u]];
	}
	if(dep[u]<dep[v]) swap(u,v);
	ans+=querysum(dfn[v],dfn[u],root[k],1,n);
	return ans;
}
inline t qrymax(t u,t v,t k){
	int ans=0;
	while(head[u]!=head[v]){
		if(dep[head[u]]<dep[head[v]]) swap(u,v);
		ans=max(ans,querymax(dfn[head[u]],dfn[u],root[k],1,n));
		u=fath[head[u]];
	}
	if(dep[u]<dep[v]) swap(u,v);
	ans=max(ans,querymax(dfn[head[u]],dfn[u],root[k],1,n));
	return ans;
}
int main(){ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>rate[i]>>bel[i];
	}
	string opt; int u,v;
	for(int i=1;i<n;i++){
		cin>>u>>v;
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	dfs1(1,0); dfs2(1,1);
	for(int i=1;i<=n;i++){
		update(dfn[i],root[bel[i]],1,n,rate[i]);
	}
	for(int i=1;i<=q;i++){
		cin>>opt>>u>>v;
		if(opt=="CC"){
			update(dfn[u],root[bel[u]],1,n,0);
			update(dfn[u],root[bel[u]=v],1,n,rate[u]);
		}
		else if(opt=="CW"){
			update(dfn[u],root[bel[u]],1,n,rate[u]=v);
		}
		else if(opt=="QS"){
			cout<<qrysum(u,v,bel[u])<<"\n";
		}
		else{
			cout<<qrymax(u,v,bel[u])<<"\n";
		}
	}
	return 0;
}
2024/9/5 21:55
加载中...