氧气有毒
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/7/19 10:33
  • 上次更新2023/11/3 08:57:30
查看原帖
氧气有毒
471571
封禁用户楼主2023/7/19 10:33

同一份代码:

这是没吸氧的记录

这是吸氧之后的记录

有没有dalao解释一下

代码贴在下面了

#include<bits/stdc++.h>
#define M 200001
#define ls p<<1
#define rs p<<1|1
#define inf 0x3f3f3f3f
using namespace std;
inline int read()
{
	int k=0,f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
	return f?-k:k;
}
int n,m,h[M],cnt,res,a[M],b[M];
int fa[M],siz[M],dep[M],son[M],son_edge[M],top[M],idx[M],cost[M];
string s;
struct edge
{
	int to,ne,val;
}w[M<<1];
struct tree
{
	int val,maxx,minn,tag;
}t[M<<2];
void add(int u,int v,int val)
{
	cnt++;
	w[cnt].to=v,w[cnt].val=val,w[cnt].ne=h[u],h[u]=cnt;
}
void dfs1(int father,int x)
{
	fa[x]=father,siz[x]=1,dep[x]=dep[father]+1;
	for(int i=h[x];i;i=w[i].ne)
	{
		int y=w[i].to;
		if(y!=father)
		{
			dfs1(x,y);
			siz[x]+=siz[y];
			if(!son[x]||siz[y]>siz[son[x]]) son[x]=y,son_edge[x]=i;
		}
	}
}
void dfs2(int topx,int x,int num)
{
	res++;
	idx[x]=res,top[x]=topx,cost[res]=w[num].val;
	if(!son[x]) return;
	dfs2(topx,son[x],son_edge[x]);
	for(int i=h[x];i;i=w[i].ne)
	{
		int y=w[i].to;
		if(y!=son[x]&&y!=fa[x]) dfs2(y,y,i);
	}
}
void dispose(int p)
{
	int maxx=t[p].maxx,minn=t[p].minn;
	t[p].maxx=-minn,t[p].minn=-maxx,t[p].val=-t[p].val;
	t[p].tag=!t[p].tag;
	return;
}
void push_up(int p)
{
	t[p].maxx=max(t[ls].maxx,t[rs].maxx);
	t[p].minn=min(t[ls].minn,t[rs].minn);
	t[p].val=t[ls].val+t[rs].val;
}
void push_down(int p)
{
	if(t[p].tag)
	{
		dispose(ls),dispose(rs);
		t[p].tag=0;
	}
}
void build(int p,int l,int r)
{
	if(l==r)
	{
		t[p].val=t[p].maxx=t[p].minn=cost[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid),build(rs,mid+1,r);
	push_up(p);
}
void update_change(int p,int l,int r,int x,int w)
{
	if(l==r)
	{
		t[p].val=t[p].maxx=t[p].minn=w;
		t[p].tag=0;
		return;
	}
	push_down(p);
	int mid=(l+r)>>1;
	if(x<=mid) update_change(ls,l,mid,x,w);
	else update_change(rs,mid+1,r,x,w);
	push_up(p);
}
void update_opposite(int p,int l,int r,int st,int en)
{
	if(st<=l&&r<=en)
	{
		dispose(p);
		return;
	}
	push_down(p);
	int mid=(l+r)>>1;
	if(st<=mid)  update_opposite(ls,l,mid,st,en);
	if(en>mid) update_opposite(rs,mid+1,r,st,en);
	push_up(p);
}
int query_val(int p,int l,int r,int st,int en)
{
	if(st<=l&&r<=en) return t[p].val;
	push_down(p);
	int mid=(l+r)>>1,tot=0;
	if(st<=mid)  tot+=query_val(ls,l,mid,st,en);
	if(en>mid) tot+=query_val(rs,mid+1,r,st,en);
	return tot;
}
int query_max(int p,int l,int r,int st,int en)
{
	if(st<=l&&r<=en) return t[p].maxx;
	push_down(p);
	int mid=(l+r)>>1,MAX=-inf;
	if(st<=mid)  MAX=max(MAX,query_max(ls,l,mid,st,en));
	if(en>mid) MAX=max(MAX,query_max(rs,mid+1,r,st,en));
	return MAX;
}
int query_min(int p,int l,int r,int st,int en)
{
	if(st<=l&&r<=en) return t[p].minn;
	push_down(p);
	int mid=(l+r)>>1,MIN=inf;
	if(st<=mid)  MIN=min(MIN,query_min(ls,l,mid,st,en));
	if(en>mid) MIN=min(MIN,query_min(rs,mid+1,r,st,en));
	return MIN;
}
int LCA(int x,int y,int k)
{
	int ans=0,MAX=-inf,MIN=inf;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		if(k==0) update_opposite(1,1,n,idx[top[x]],idx[x]);
		else if(k==1) ans+=query_val(1,1,n,idx[top[x]],idx[x]);
		else if(k==2) MAX=max(MAX,query_max(1,1,n,idx[top[x]],idx[x]));
		else MIN=min(MIN,query_min(1,1,n,idx[top[x]],idx[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	if(idx[x]+1<=idx[y])
	{
		if(k==0) update_opposite(1,1,n,idx[x]+1,idx[y]);
		else if(k==1) ans+=query_val(1,1,n,idx[x]+1,idx[y]);
		else if(k==2) MAX=max(MAX,query_max(1,1,n,idx[x]+1,idx[y]));
		else MIN=min(MIN,query_min(1,1,n,idx[x]+1,idx[y]));
	}
	if(k==1) return ans;
	else if(k==2) return MAX;
	else if(k==3) return MIN;
}
int get(int i)
{
	return dep[a[i]]>dep[b[i]]?a[i]:b[i];
}
int main()
{
	n=read();
	for(int i=1;i<n;i++)
	{
		int u=read()+1,v=read()+1,val=read();
		a[i]=u,b[i]=v;
		add(u,v,val),add(v,u,val);
	}
	dfs1(0,1);
	dfs2(1,1,0);
	build(1,1,n);
	m=read();
	while(m--)
	{
		cin>>s;
		int x=read()+1,y=read()+1;
		if(s=="C") update_change(1,1,n,idx[get(x-1)],y-1);
		else if(s=="N") LCA(x,y,0);
		else if(s=="SUM") printf("%d\n",LCA(x,y,1));
		else if(s=="MAX") printf("%d\n",LCA(x,y,2));
		else if(s=="MIN") printf("%d\n",LCA(x,y,3));
	}
	return 0;
}
2023/7/19 10:33
加载中...