20pts求调
查看原帖
20pts求调
259300
hy233楼主2022/2/9 21:03
#include<bits/stdc++.h>
using namespace std;
int n;
vector <pair<int,int> > mp[200005];
int fa[200005];
int dep[200005];
int siz[200005];
int hs[200005];
int tp[200005];
int dfn[200005],cnt=0;
pair<int,int> ed[200005];
int a[200005];
int da[200005];
void dfs1(int s,int f)
{
	fa[s]=f;
	dep[s]=dep[f]+1;
	siz[s]=1;
	for(int i=0;i<mp[s].size();i++)
	{
		int v=mp[s][i].first;
		if(v==f) continue;
		a[v]=mp[s][i].second;
		dfs1(v,s);
		siz[s]+=siz[v];
		if(siz[hs[s]]<siz[v])
			hs[s]=v;
	}
}
void dfs2(int s,int t)
{
	tp[s]=t;
	dfn[s]=++cnt;
	da[dfn[s]]=a[s];
	if(hs[s])
		dfs2(hs[s],t);
	for(int i=0;i<mp[s].size();i++)
	{
		int v=mp[s][i].first;
		if(v==fa[s]||v==hs[s])
			continue;
		dfs2(v,v);
	} 
}
struct Sgt
{
	int l,r;
	int sm;
	int mx,mi;
	bool lt;
}t[1000005];
void pushup(int p)
{
	t[p].sm=t[p*2].sm+t[p*2+1].sm;
	t[p].mx=max(t[p*2].mx,t[p*2+1].mx);
	t[p].mi=min(t[p*2].mi,t[p*2+1].mi);
}
void pushdown(int p)
{
	if(!t[p].lt) return;
	t[p*2].sm=-t[p*2].sm;
	swap(t[p*2].mx,t[p*2].mi);
	t[p*2].mx=-t[p*2].mx;
	t[p*2].mi=-t[p*2].mi;
	
	t[p*2+1].sm=-t[p*2+1].sm;
	swap(t[p*2+1].mx,t[p*2+1].mi);
	t[p*2+1].mx=-t[p*2+1].mx;
	t[p*2+1].mi=-t[p*2+1].mi;
	
	t[p].lt=0;
	t[p*2].lt=!t[p*2].lt;
	t[p*2+1].lt=!t[p*2+1].lt;
} 
void build(int l,int r,int p)
{
	t[p].l=l; t[p].r=r;
	t[p].lt=0;
	if(l==r)
	{
		t[p].sm=t[p].mx=t[p].mi=da[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	pushup(p);
}
void fan(int l,int r,int p)
{
	if(t[p].l>=l&&t[p].r<=r)
	{
		t[p].sm=-t[p].sm;
		swap(t[p].mx,t[p].mi);
		t[p].mx=-t[p].mx;
		t[p].mi=-t[p].mi;
		
		t[p].lt=!t[p].lt;
		return;
	}
	pushdown(p); 
	int mid=(t[p].l+t[p].r)/2;
	if(l<=mid) fan(l,r,p*2);
	if(r>=mid+1) fan(l,r,p*2+1); 
	pushup(p);
}
void change(int x,int k,int p)
{
	if(t[p].l==t[p].r)
	{
		t[p].sm=t[p].mx=t[p].mi=k;
		return;
	}
	pushdown(p);
	int mid=(t[p].l+t[p].r)/2;
	if(x<=mid) change(x,k,p*2);
	else change(x,k,p*2+1);
	pushup(p);
}
int quesum(int l,int r,int p)
{
	if(t[p].l>=l&&t[p].r<=r)
		return t[p].sm;
	pushdown(p);
	int mid=(t[p].l+t[p].r)/2;
	int s=0;
	if(l<=mid) s+=quesum(l,r,p*2);
	if(r>=mid+1) s+=quesum(l,r,p*2+1);
	return s; 
}
int quemax(int l,int r,int p)
{
	if(t[p].l>=l&&t[p].r<=r)
		return t[p].mx;
	pushdown(p);
	int mid=(t[p].l+t[p].r)/2;
	int m=-0x7fffffff;
	if(l<=mid) m=max(m,quemax(l,r,p*2));
	if(r>=mid+1) m=max(m,quemax(l,r,p*2+1));
	return m; 
}
int quemin(int l,int r,int p)
{
	if(t[p].l>=l&&t[p].r<=r)
		return t[p].mi;
	pushdown(p);
	int mid=(t[p].l+t[p].r)/2;
	int m=0x7fffffff;
	if(l<=mid) m=min(m,quemin(l,r,p*2));
	if(r>=mid+1) m=min(m,quemin(l,r,p*2+1));
	return m; 
}
int main()
{
	cin>>n;
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		u++; v++;
		mp[u].push_back(make_pair(v,w));
		mp[v].push_back(make_pair(u,w));
		ed[i]=make_pair(u,v); 
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,n,1);
	int m;
	cin>>m;
	while(m--)
	{
		string str;
		int x,y;
		cin>>str;
		cin>>x>>y;
		x++; y++;
		if(str=="C")
		{
			x--; y--;
			int lp=ed[x].first;
			int rp=ed[x].second;
			if(dep[lp]<dep[rp]) swap(lp,rp);
			change(dfn[lp],y,1);	
		}
		
		else if(str=="N")
		{
			while(tp[x]!=tp[y])
			{
				if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
				fan(dfn[tp[x]],dfn[x],1);
				x=fa[tp[x]];
			}
			if(dfn[x]>dfn[y]) swap(x,y);
			fan(dfn[x]+1,dfn[y],1);
		}
		else if(str=="SUM")
		{
			int s=0;
			while(tp[x]!=tp[y])
			{
				if(dep[x]<dep[y]) swap(x,y);
				s+=quesum(dfn[tp[x]],dfn[x],1);
				x=fa[tp[x]];
			}
			if(dfn[x]>dfn[y]) swap(x,y);
			s+=quesum(dfn[x]+1,dfn[y],1);
			cout<<s<<endl;
		}
		else if(str=="MAX")
		{
			int s=-0x7fffffff;
			while(tp[x]!=tp[y])
			{
				if(dep[x]<dep[y]) swap(x,y);
				s=max(s,quemax(dfn[tp[x]],dfn[x],1));
				x=fa[tp[x]];
			}
			if(dfn[x]>dfn[y]) swap(x,y);
			s=max(s,quemax(dfn[x]+1,dfn[y],1));
			cout<<s<<endl;
		}
		else if(str=="MIN")
		{
			int s=0x7fffffff;
			while(tp[x]!=tp[y])
			{
				if(dep[x]<dep[y]) swap(x,y);
				s=min(s,quemin(dfn[tp[x]],dfn[x],1));
				x=fa[tp[x]];
			}
			if(dfn[x]>dfn[y]) swap(x,y);
			s=min(s,quemin(dfn[x]+1,dfn[y],1));
			cout<<s<<endl;
		}	
	}
	return 0;
} 
2022/2/9 21:03
加载中...