P1505求助!悬2关
  • 板块灌水区
  • 楼主ChenZQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/13 15:52
  • 上次更新2025/1/13 19:18:10
查看原帖
P1505求助!悬2关
745358
ChenZQ楼主2025/1/13 15:52

求助调了好久!

#include <bits/stdc++.h>//ZPYV
using namespace std;

const int N = 800010;
int h[N],e[N],ne[N],w[N],idx,t[N],dep[N],id[N],cnt,top[N],sz[N],bs[N],k[N];
int x[N],y[N],z[N],seg[N],tag[N],mx[N],mi[N],fa[N],f[N];
void add(int a,int b,int c)
{
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int n;
void dfs(int u,int f)
{
	dep[u]=dep[f]+1;
	fa[u]=f;
	int mx=0,iid=0;sz[u]++;
	for(int i=h[u];i!=-1;i=ne[i])
	{
		if(e[i]!=f)
		{
			dfs(e[i],u);t[e[i]]=w[i];
			sz[u]+=sz[e[i]];
			if(sz[e[i]]>mx) mx=sz[e[i]],iid=e[i];
		}
	}
	bs[u]=iid;
}
void dfs2(int u,int f,int tp)
{
	id[u]=++cnt;
	k[cnt]=t[u];
	top[u]=tp;
	if(bs[u]) dfs2(bs[u],u,tp);
	for(int i=h[u];i!=-1;i=ne[i])
	{
		if(e[i]!=f && e[i]!=bs[u]) dfs2(e[i],u,e[i]);
	}
}
void build(int l,int r,int u)
{
	if(l==r)
	{
		seg[u]=k[l];
		mx[u]=mi[u]=k[l];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,u<<1);
	build(mid+1,r,u<<1|1);
	seg[u]=seg[u<<1]+seg[u<<1|1];
	mi[u]=min(mi[u<<1],mi[u<<1|1]);
	mx[u]=max(mx[u<<1],mx[u<<1|1]);
}
void pd(int u,int l,int r)
{
	if(f[u])
	{
		seg[u<<1]=-seg[u<<1];swap(mi[u<<1],mx[u<<1]);mi[u<<1]=-mi[u<<1];mx[u<<1]=-mx[u<<1];
		seg[u<<1|1]=-seg[u<<1|1];swap(mi[u<<1|1],mx[u<<1|1]);
		mi[u<<1|1]=-mi[u<<1|1];mx[u<<1|1]=-mx[u<<1|1];
		f[u]=0;f[u<<1]^=1;f[u<<1|1]^=1;
	}
}
void update(int l,int r,int ll,int rr,int u,int w)
{
	if(l>=ll && r<=rr)
	{
		seg[u]=mi[u]=mx[u]=w;
		return;
	}
	pd(u,l,r);
	int mid=(l+r)>>1;
	if(mid>=ll) update(l,mid,ll,rr,u<<1,w);
	if(mid<rr) update(mid+1,r,ll,rr,u<<1|1,w);
	seg[u]=seg[u<<1]+seg[u<<1|1];
	mi[u]=min(mi[u<<1],mi[u<<1|1]);
	mx[u]=max(mx[u<<1],mx[u<<1|1]);
}
void fan(int l,int r,int ll,int rr,int u)
{
	if(l>=ll && r<=rr)
	{
		f[u]^=1;seg[u]=-seg[u];
		swap(mi[u],mx[u]);
		mi[u]=-mi[u];
		mx[u]=-mx[u];
		return;
	}
	pd(u,l,r);
	int mid=(l+r)>>1;
	if(mid>=ll) fan(l,mid,ll,rr,u<<1);
	if(mid<rr) fan(mid+1,r,ll,rr,u<<1|1);
	seg[u]=seg[u<<1]+seg[u<<1|1];
	mi[u]=min(mi[u<<1],mi[u<<1|1]);
	mx[u]=max(mx[u<<1],mx[u<<1|1]);
}
int query(int l,int r,int ll,int rr,int u)
{
	if(l>=ll && r<=rr) return seg[u];
	pd(u,l,r);
	int mid=(l+r)>>1;
	int ans=0;
	if(mid>=ll) ans+=query(l,mid,ll,rr,u<<1);
	if(mid<rr) ans+=query(mid+1,r,ll,rr,u<<1|1);
	return ans;
}
int fdmax(int l,int r,int ll,int rr,int u)
{
	if(l>=ll && r<=rr) return mx[u];
	pd(u,l,r);
	int mid=(l+r)>>1;
	int ans=0;
	if(mid>=ll) ans=max(ans,fdmax(l,mid,ll,rr,u<<1));
	if(mid<rr) ans=max(ans,fdmax(mid+1,r,ll,rr,u<<1|1));
	return ans;
}
int fdmin(int l,int r,int ll,int rr,int u)
{
	if(l>=ll && r<=rr) return mi[u];
	pd(u,l,r);
	int mid=(l+r)>>1;
	int ans=(int)1e9;
	if(mid>=ll) ans=min(ans,fdmin(l,mid,ll,rr,u<<1));
	if(mid<rr) ans=min(ans,fdmin(mid+1,r,ll,rr,u<<1|1));
	return ans;
}
void updw(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		fan(1,n,id[top[x]],id[x],1);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	fan(1,n,id[x]+1,id[y],1);
}
void qusum(int x,int y)
{
	int ans=0;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans+=query(1,n,id[top[x]],id[x],1);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans+=query(1,n,id[x]+1,id[y],1);
	printf("%d\n",ans);
}
void qumax(int x,int y)
{
	int ans=0;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=max(ans,fdmax(1,n,id[top[x]],id[x],1));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans=max(ans,fdmax(1,n,id[x]+1,id[y],1));
	printf("%d\n",ans);
}
void qumin(int x,int y)
{
	int ans=(int)1e9;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=min(ans,fdmin(1,n,id[top[x]],id[x],1));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans=min(ans,fdmin(1,n,id[x]+1,id[y],1));
	printf("%d\n",ans);
}
int main()
{
	scanf("%d",&n);
	memset(h,-1,sizeof h);
	for(int i=1;i<=n-1;i++)
	{
		int a,b,c;
		a++,b++;
		scanf("%d%d%d",&a,&b,&c);x[i]=a,y[i]=b,z[i]=c;
		add(a,b,c);add(b,a,c);
	}
	dfs(1,1);
	dfs2(1,1,1);
	build(1,n,1);
	int m;
	scanf("%d",&m);
	while(m--)
	{
		char s[4];
		int a,b;
		scanf("%s",s);
		if(s[0]=='C') 
		{
			scanf("%d%d",&a,&b);
			if(dep[x[a]]>dep[y[a]]) update(1,n,id[x[a]],id[x[a]],1,b);
			else update(1,n,id[y[a]],id[y[a]],1,b);
		}
		else if(s[0]=='N') 
		{
			a++,b++;
			scanf("%d%d",&a,&b);
			updw(a,b);
		}
		else if(s[0]=='S')
		{
			a++,b++;
			scanf("%d%d",&a,&b);
			qusum(a,b);
		}
		else if(s[1]=='A')
		{
			a++,b++;
			scanf("%d%d",&a,&b);
			qumax(a,b);
		}
		else 
		{
			a++,b++;
			scanf("%d%d",&a,&b);
			qumin(a,b);
		}
	}
}
2025/1/13 15:52
加载中...