WA保龄,悬赏2关注
查看原帖
WA保龄,悬赏2关注
345900
Haber楼主2022/12/16 20:03
#include<bits/stdc++.h>
#define lid id<<1
#define rid id<<1|1
using namespace std;
int n;
const int N=1e5+5;
int h[N],ne[N<<1],to[N<<1],idx;
int cnt,son[N],siz[N],dep[N],top[N],fa[N],dfn[N];
int a[N],b[N],c[N];
struct tree{
	int l,r,mx,lazy1,lazy2;
	bool co;
}tr[N<<2];
void add(int a,int b){
	to[++idx]=b;
	ne[idx]=h[a];
	h[a]=idx;
}
void dfs1(int x){
	siz[x]=1,son[x]=-1;
	for(int i=h[x];i!=-1;i=ne[i]){
		int j=to[i];
		if(j==fa[x]) continue;
		dep[j]=dep[x]+1;
		fa[j]=x;
		dfs1(j);
		siz[x]+=siz[j];
		if(son[x]==-1||siz[j]>siz[son[x]]) son[x]=j;
	}
}
void dfs2(int x,int tp){
	top[x]=tp;
	dfn[x]=++cnt;
	if(son[x]==-1) return ;
	dfs2(son[x],tp);
	for(int i=h[x];i!=-1;i=ne[i]){
		int j=to[i];
		if(j!=son[x]&&j!=fa[x]) dfs2(j,j);
	}
}
void pushdown(int id){
	if(tr[id].l!=tr[id].r&&tr[id].co){
		tr[lid].mx=tr[id].lazy1;
		tr[rid].mx=tr[id].lazy1;
		tr[lid].lazy1=tr[id].lazy1;
		tr[rid].lazy1=tr[id].lazy1;
		tr[lid].mx+=tr[id].lazy2;
		tr[rid].mx+=tr[id].lazy2;
		tr[lid].lazy2+=tr[id].lazy2;
		tr[rid].lazy2+=tr[id].lazy2;
		tr[id].co=false;
	}
}
void build(int id,int l,int r){
	tr[id].l=l,tr[id].r=r,tr[id].co=false,tr[id].mx=0;
	if(l==r) return ;
	int mid=(l+r)>>1;
	build(lid,l,mid);
	build(rid,mid+1,r);
}
void modify1(int id,int x,int v){
	pushdown(id);
	if(tr[id].l==tr[id].r){
		tr[id].mx=v;
		return;
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	if(x<=mid) modify1(lid,x,v);
	else modify1(rid,x,v);
	tr[id].mx=max(tr[lid].mx,tr[rid].mx);
}
void modify2(int id,int l,int r,int v){
	pushdown(id);
	if(tr[id].l==l&&tr[id].r==r){
		tr[id].mx=v;
		tr[id].lazy2=0;
		tr[id].lazy1=v;
		tr[id].co=true;
		return ;
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	if(r<=mid) modify2(lid,l,r,v);
	else if(l>mid) modify2(rid,l,r,v);
	else modify2(lid,l,mid,v),modify2(rid,mid+1,r,v);
	tr[id].mx=max(tr[lid].mx,tr[rid].mx);
}
void modify3(int id,int l,int r,int v){
	pushdown(id);
	if(tr[id].l==l&&tr[id].r==r){
		tr[id].mx+=v;
		tr[id].lazy2+=v;
		tr[id].co=true;
		return ;
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	if(r<=mid) modify3(lid,l,r,v);
	else if(l>mid) modify3(rid,l,r,v);
	else modify3(lid,l,mid,v),modify3(rid,mid+1,r,v);
	tr[id].mx=max(tr[lid].mx,tr[rid].mx);
}
int query(int id,int l,int r){
	pushdown(id);
	if(tr[id].l==l&&tr[id].r==r) return tr[id].mx;
	int mid=(tr[id].l+tr[id].r)>>1;
	if(r<=mid) return query(lid,l,r);
	else if(l>mid) return query(rid,l,r);
	else return max(query(lid,l,mid),query(rid,mid+1,r));
}
int main(){
//	freopen("P4315_1.in","r",stdin);
//	freopen("P4315.out","w",stdout);
	memset(h,-1,sizeof h);
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		scanf("%d%d%d",&a[i],&b[i],&c[i]);
		add(a[i],b[i]),add(b[i],a[i]);
	}
	dfs1(1),dfs2(1,1);
	build(1,1,n);
	for(int i=1;i<n;i++){
		if(dfn[a[i]]>dfn[b[i]]) modify1(1,dfn[a[i]],c[i]);
		else modify1(1,dfn[b[i]],c[i]);
	}
	while(true){
		string op;
		int x,y,w;
		cin>>op;
		if(op=="Stop") break;
		if(op=="Max"){
			scanf("%d%d",&x,&y);
//			printf("Max %d %d\n",x,y);
			int ans=-0x3f3f3f3f;
			while(top[x]!=top[y]){
				if(dep[top[x]]<dep[top[y]]) swap(x,y);
				ans=max(ans,query(1,dfn[top[x]],dfn[x]));
				x=fa[top[x]];
			}
			if(dfn[x]>dfn[y]) swap(x,y);
			if(dfn[x]!=dfn[y]) ans=max(ans,query(1,dfn[x]+1,dfn[y]));
			printf("%d\n",ans);
		}
		else if(op=="Cover"){
			scanf("%d%d%d",&x,&y,&w);
//			printf("Cover %d %d %d\n",x,y,w);
			while(top[x]!=top[y]){
				if(dep[top[x]]<dep[top[y]]) swap(x,y);
				modify2(1,dfn[top[x]],dfn[x],w);
				x=fa[top[x]];
			}
			if(dep[x]>dep[y]) swap(x,y);
			if(dfn[x]!=dfn[y]) modify2(1,dfn[x]+1,dfn[y],w);
		}
		else if(op=="Add"){
			scanf("%d%d%d",&x,&y,&w);
//			printf("Add %d %d %d\n",x,y,w);
			while(top[x]!=top[y]){
				if(dep[top[x]]<dep[top[y]]) swap(x,y);
				modify3(1,dfn[top[x]],dfn[x],w);
				x=fa[top[x]];
			}
			if(dep[x]>dep[y]) swap(x,y);
			if(dfn[x]!=dfn[y]) modify3(1,dfn[x]+1,dfn[y],w);
		}
		else{
			scanf("%d%d",&x,&w);
//			printf("Change %d %d\n",x,w);
			modify1(1,max(dfn[a[x]],dfn[b[x]]),w);
		}
	}
	return 0;
} 

24小时内到账。

2022/12/16 20:03
加载中...