萌新刚学树剖,20pts求调,马蜂较好
查看原帖
萌新刚学树剖,20pts求调,马蜂较好
256970
xie_lzh楼主2021/10/2 11:40

只A了最后两个点

#include<bits/stdc++.h>
using namespace std;
#define re register
#define int long long
const int N=2e5+5;
int n,m,u[N],v[N],w,a,b;
int dep[N],top[N],id[N],wt[N],siz[N],fa[N],son[N],cnt,tmp[N];
int head[N],to[N<<1],nxt[N<<1],val[N<<1],tot;
int sum[N<<2],Min[N<<2],Max[N<<2],laz[N<<2];
string opt;
int read()
{
	int r=0,f=1;
	char c=getchar();
	while(!isdigit(c))
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(isdigit(c))
	{
		r=(r<<1)+(r<<3)+c-48;
		c=getchar();
	}
	return r*f;
}
void add(int u,int v,int w)
{
	val[++tot]=w;
	to[tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
}
void dfs1(int f,int now)
{
	dep[now]=dep[f]+1;
	fa[now]=f;
	siz[now]=1;
	int hson=-1;
	for(int i=head[now];i;i=nxt[i])
	{
		int v=to[i];
		if(v==f) continue;
		dfs1(now,v);
		siz[now]+=siz[v];
		tmp[v]=val[i];
		if(siz[v]>hson)
		{
			hson=siz[v];
			son[now]=v;
		}
	}
}
void dfs2(int now,int topf)
{
	id[++cnt]=now;
	wt[cnt]=tmp[now];
	top[now]=topf;
//	cout<<now<<endl;
	if(!son[now]) return ;
	dfs2(son[now],topf);
	for(int i=head[now];i;i=nxt[i])
	{
		int v=to[i];
		if(v==fa[now]||v==son[now]) continue;
		dfs2(v,v);
	}
}
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void pushup(int x)
{
	sum[x]=sum[ls(x)]+sum[rs(x)];
	Max[x]=max(Max[ls(x)],Max[rs(x)]);
	Min[x]=min(Min[ls(x)],Min[rs(x)]);
}
void build(int p,int l,int r)
{
	if(l==r)
	{
		Min[p]=wt[l];
		Max[p]=wt[l];
		sum[p]=wt[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(p);
}
void push_down(int x)
{
	laz[ls(x)]^=1;
	laz[rs(x)]^=1;
	sum[ls(x)]=-sum[ls(x)];
	sum[rs(x)]=-sum[rs(x)];
	Max[ls(x)]*=-1; Max[rs(x)]*=-1;
	Min[ls(x)]*=-1; Min[rs(x)]*=-1;
	swap(Max[ls(x)],Min[ls(x)]);
	swap(Max[rs(x)],Min[rs(x)]);
	laz[x]=0;
}
void updval(int p,int l,int r,int L,int k)
{
	if(l==r)
	{
		sum[p]=k;
		Max[p]=k;
		Min[p]=k;
		return ;
	}
	if(laz[p]) push_down(p);
	int mid=(l+r)>>1;
	if(L<=mid) updval(ls(p),l,mid,L,k);
	else updval(rs(p),mid+1,r,L,k);
	pushup(p);
}
void updop(int p,int l,int r,int L,int R)
{
	if(L<=l&&r<=R)
	{
		laz[p]^=1;
		sum[p]*=-1;
		Max[p]*=-1;
		Min[p]*=-1;
		swap(Max[p],Min[p]);
		return ;
	}
	if(laz[p]) push_down(p);
	int mid=(l+r)>>1;
	if(L<=mid) updop(ls(p),l,mid,L,R);
	if(R>mid)  updop(rs(p),mid+1,r,L,R);
	pushup(p);
}
int querysum(int p,int l,int r,int L,int R)
{
	if(L<=l&&r<=R) return sum[p];
	if(laz[p]) push_down(p);
	int mid=(l+r)>>1,res=0;
	if(L<=mid) res+=querysum(ls(p),l,mid,L,R);
	if(R>mid)  res+=querysum(rs(p),mid+1,r,L,R);
	pushup(p);
	return res;
}
int querymin(int p,int l,int r,int L,int R)
{
	if(L<=l&&r<=R) return Min[p];
	if(laz[p]) push_down(p);
	int mid=(l+r)>>1,res=2e9;
	if(L<=mid) res=min(res,querymin(ls(p),l,mid,L,R));
	if(R>mid)  res=min(res,querymin(rs(p),mid+1,r,L,R));
	pushup(p);
	return res;
}
int querymax(int p,int l,int r,int L,int R)
{
	if(L<=l&&r<=R) return Max[p];
	if(laz[p]) push_down(p);
	int mid=(l+r)>>1,res=-2e9;
	if(L<=mid) res=max(res,querymax(ls(p),l,mid,L,R));
	if(R>mid)  res=max(res,querymax(rs(p),mid+1,r,L,R));
	pushup(p);
	return res;
}
void updrangeop(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		updop(1,1,n,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	if(x!=y) updop(1,1,n,id[x]+1,id[y]);
}
int qsum(int x,int y)
{
	int ans=0;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans+=querysum(1,1,n,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	if(x!=y) ans+=querysum(1,1,n,id[x]+1,id[y]);
	return ans;
}
int qmax(int x,int y)
{
	int ans=-2e9;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=max(ans,querymax(1,1,n,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	if(x!=y) ans=max(ans,querymax(1,1,n,id[x]+1,id[y]));
	return ans;
}
int qmin(int x,int y)
{
	int ans=2e9;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=min(ans,querymin(1,1,n,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	if(x!=y) ans=min(ans,querymin(1,1,n,id[x]+1,id[y]));
	return ans;
}
signed main()
{
	n=read();
	for(re int i=1;i<n;i++)
	{
		u[i]=read()+1;
		v[i]=read()+1;
		w=read(); 
		add(u[i],v[i],w);
		add(v[i],u[i],w);
	}
	dfs1(0,1);
	dfs2(1,1);
//	puts("");
//	for(int i=1;i<=n;i++)
//		printf("%d %d %d %d\n",id[i],wt[i],top[i],dep[i]);
	build(1,1,n);
	m=read();
	while(m--)
	{
		cin>>opt;
		a=read(); b=read();
		if(opt[0]=='C')
		{
			if(dep[u[a]]>dep[v[a]]) updval(1,1,n,id[u[a]],b);
			else updval(1,1,n,id[v[a]],b);
		}
		else if(opt[0]=='N') updrangeop(a+1,b+1);
		else if(opt[1]=='U') printf("%lld\n",qsum(a+1,b+1));
		else if(opt[1]=='A') printf("%lld\n",qmax(a+1,b+1));
		else printf("%lld\n",qmin(a+1,b+1));
	}
} 

出去吃饭了,可能不能及时回复,敬请谅解

2021/10/2 11:40
加载中...