爆零求deQAQ,sum都对但是max不对QAQ
查看原帖
爆零求deQAQ,sum都对但是max不对QAQ
206676
YaeMik0楼主2021/8/27 13:39
#include<bits/stdc++.h>
#define N 200005
#define int long long
#define mid (l+r>>1)
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
	return x*f;
}
struct edge{int to,nxt,cost;}e[N];
struct tree{int ls,rs,sum,maxn;}tr[N*50];
int ecnt=-1,head[N],dep[N],siz[N],fa[N],hson[N],top[N],dfn[N],pos[N],cnt;
int n,m,lz[4*N],w[N],c[N],qcnt,tot,r[N];
void insert(int x,int y,int z){e[++ecnt]=(edge){y,head[x],z};head[x]=ecnt;}
void dfs1(int now,int fa_now){
	fa[now]=fa_now;siz[now]=1;dep[now]=dep[fa_now]+1;hson[now]=-1;
	for(int i=head[now];~i;i=e[i].nxt){
		int to=e[i].to;
		if(to==fa_now)continue;
		dfs1(to,now);siz[now]+=siz[to];
		if(hson[now]=-1||siz[to]>siz[hson[now]])hson[now]=to;
	}
}
void dfs2(int now,int top_now){
	top[now]=top_now;dfn[now]=++cnt;pos[cnt]=now;
	if(hson[now]==-1)return;
	dfs2(hson[now],top_now);
	for(int i=head[now];~i;i=e[i].nxt)if(e[i].to!=hson[now]&&e[i].to!=fa[now])dfs2(e[i].to,e[i].to);
}
int New(){tr[++tot].ls=tr[tot].rs=tr[tot].sum=tr[tot].maxn=0;return tot;}
void modify(int &p,int l,int r,int pos,int x){
	if(!p)p=New();
	if(l==r){tr[p].sum=tr[p].maxn+=x;return;}
	if(pos<=mid)modify(tr[p].ls,l,mid,pos,x);
	else modify(tr[p].rs,mid+1,r,pos,x);
	tr[p].sum=tr[tr[p].ls].sum+tr[tr[p].rs].sum;
	tr[p].maxn=max(tr[tr[p].ls].maxn,tr[tr[p].rs].maxn);
}
int query(int p,int l,int r,int ql,int qr){
	if(l>qr||r<ql||!p)return 0;
	if(l>=ql&&r<=qr)return tr[p].sum;
	return query(tr[p].ls,l,mid,ql,qr)+query(tr[p].rs,mid+1,r,ql,qr);
}
int max_query(int p,int l,int r,int ql,int qr){
	if(l>qr||r<ql||!p)return 0;
	if(l>=ql&&r<=qr)return tr[p].maxn;
	return max(max_query(tr[p].ls,l,mid,ql,qr),max_query(tr[p].rs,mid+1,r,ql,qr));
}
int summary_chain(int x,int y,int now_c){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ans+=query(r[now_c],1,n,dfn[top[x]],dfn[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	ans+=query(r[now_c],1,n,dfn[x],dfn[y]);
	return ans;
}
int max_chain(int x,int y,int now_c){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ans=max(ans,max_query(r[now_c],1,n,dfn[top[x]],dfn[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	ans=max(ans,max_query(r[now_c],1,n,dfn[top[x]],dfn[x]));
	return ans;
}
signed main(){
	memset(head,-1,sizeof(head));
	n=read(),m=read();
	for(int i=1;i<=n;i++)w[i]=read(),c[i]=read();
	for(int i=1;i<=n-1;i++){int x=read(),y=read();insert(x,y,0);insert(y,x,0);}
	dfs1(1,0);dfs2(1,1);
	for(int i=1;i<=n;i++)modify(r[c[i]],1,n,dfn[i],w[i]);
	for(int i=1;i<=m;i++){
		string s;cin>>s;int x=read(),y=read();
		if(s[1]=='C'){modify(r[c[x]],1,n,dfn[x],-w[x]);c[x]=y;modify(r[c[x]],1,n,pos[x],w[x]);}
		if(s[1]=='W'){modify(r[c[x]],1,n,dfn[x],y-w[x]);w[x]=y;}
		if(s[1]=='S')printf("%lld\n",summary_chain(x,y,c[x]));
		if(s[1]=='M')printf("%lld\n",max_chain(x,y,c[x]));
	}
	return 0;
}
2021/8/27 13:39
加载中...