如果你曾经MLE on #12
查看原帖
如果你曾经MLE on #12
366468
_Z_Y_X_SWS楼主2023/10/8 11:47

那就快来帮帮我吧QWQ

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,r,p,fa[N],siz[N],son[N],deep[N],top[N],id[N],cnt,w[N],h[N],tot;
struct EDge {
	int u,v,d,next;
}e[N*2];
void add (int u,int v,int d){
	e[++tot].u=u;
	e[tot].v=v;
	e[tot].d=d;
	e[tot].next=h[u];
	h[u]=tot;
}
struct TREE {
	int l,r,d,lazy,mx,mi;
}t[N*4];
void build (int k,int l,int r){
	t[k].l=l;
	t[k].r=r;
	int mid=(l+r)>>1;
	if (l==r){
		t[k].d=t[k].mi=t[k].mx=w[l];
		return;
	}
	build (k*2,l,mid);
	build (k*2+1,mid+1,r);
	t[k].d=(t[k*2].d+t[k*2+1].d);
	t[k].mi=min(t[k*2].mi,t[k*2+1].mi);
	t[k].mx=max(t[k*2].mx,t[k*2+1].mx);
}
void xr (int k){
	t[k].d*=-1;
	if (t[k].lazy==0){
		t[k].lazy=-1;
	}
	else {
		t[k].lazy=0;
	}
	int kkk=t[k].mx;
	t[k].mx=-1*t[k].mi;
	t[k].mi=-1*kkk;
}
void pushdown(int k){
	if (t[k].l!=t[k].r&&t[k].lazy==-1){
		xr(k*2);
		xr(k*2+1);
	}
	t[k].lazy=0;
}
void change (int k,int l,int r){
	if (t[k].l>r||t[k].r<l){
		return;
	}
	if (t[k].r<=r&&t[k].l>=l){
		xr(k);
		return;
	}
	pushdown(k);
	change (k*2,l,r);
	change (k*2+1,l,r);
	t[k].d=(t[k*2].d+t[k*2+1].d);
	t[k].mi=min(t[k*2].mi,t[k*2+1].mi);
	t[k].mx=max(t[k*2].mx,t[k*2+1].mx);
}
void change2 (int k,int x,int d){
	if (t[k].l>x||t[k].r<x){
		return;
	}
	if (t[k].r==x&&t[k].l==x){
		t[k].d=t[k].mi=t[k].mx=d;
		return;
	}
	pushdown(k);
	change2 (k*2,x,d);
	change2 (k*2+1,x,d);
	t[k].d=(t[k*2].d+t[k*2+1].d);
	t[k].mi=min(t[k*2].mi,t[k*2+1].mi);
	t[k].mx=max(t[k*2].mx,t[k*2+1].mx);
}
int query (int k,int l,int r){
	if (t[k].l>r||t[k].r<l){
		return 0;
	}
	if (t[k].r<=r&&t[k].l>=l){
		return t[k].d;
	}
	pushdown(k);
	return (query(k*2,l,r)+query(k*2+1,l,r));
}
int qmx (int k,int l,int r){
	if (t[k].l>r||t[k].r<l){
		return -2147483647;
	}
	if (t[k].r<=r&&t[k].l>=l){
		return t[k].mx;
	}
	pushdown(k);
	return max(qmx(k*2,l,r),qmx(k*2+1,l,r));
}
int qmi (int k,int l,int r){
	if (t[k].l>r||t[k].r<l){
		return 2147483647;
	}
	if (t[k].r<=r&&t[k].l>=l){
		return t[k].mi;
	}
	pushdown(k);
	return min(qmi(k*2,l,r),qmi(k*2+1,l,r));
}
void dfs1 (int x,int f,int dep){
	fa[x]=f;
	int mx=0;
	siz[x]=1;
	deep[x]=dep;
	for (int i=h[x];i;i=e[i].next){
		int y=e[i].v;
		if (y!=f){
			dfs1(y,x,dep+1);
			siz[x]+=siz[y];
			if (siz[y]>mx){
				mx=siz[y];
				son[x]=y;
			}
		}
	}
}
void dfs2(int x,int tp){
	id[x]=++cnt;
	top[x]=tp;
	if (son[x]){
		dfs2(son[x],tp);
	}
	for (int i=h[x];i;i=e[i].next){
		int y=e[i].v;
		if (y!=fa[x]){
			if (y!=son[x]){
				dfs2(y,y);
			}
			w[id[y]]=e[i].d;
		}
	}
}
void crange (int u,int v){
	while (top[u]!=top[v]){
		if (deep[top[u]]<deep[top[v]]){
			swap(u,v);
		}
		change (1,id[top[u]],id[u]);
		u=fa[top[u]];
	}
	if (deep[u]>deep[v]){
		swap(u,v);
	}
	change (1,id[u]+1,id[v]);
}
int qrange (int u,int v){
	int ans=0;
	while (top[u]!=top[v]){
		if (deep[top[u]]<deep[top[v]]){
			swap(u,v);
		}
		ans=(ans+query(1,id[top[u]],id[u]));
		u=fa[top[u]];
	}
	if (deep[u]>deep[v]){
		swap(u,v);
	}
	return (ans+query(1,id[u]+1,id[v]));
}
int mxrange (int u,int v){
	int ans=-2147483647;
	while (top[u]!=top[v]){
		if (deep[top[u]]<deep[top[v]]){
			swap(u,v);
		}
		ans=max(ans,qmx(1,id[top[u]],id[u]));
		u=fa[top[u]];
	}
	if (deep[u]>deep[v]){
		swap(u,v);
	}
	return max(ans,qmx(1,id[u]+1,id[v]));
}
int mirange (int u,int v){
	int ans=2147483647;
	while (top[u]!=top[v]){
		if (deep[top[u]]<deep[top[v]]){
			swap(u,v);
		}
		ans=min(ans,qmi(1,id[top[u]],id[u]));
		u=fa[top[u]];
	}
	if (deep[u]>deep[v]){
		swap(u,v);
	}
	return min(ans,qmi(1,id[u]+1,id[v]));
}
int main (){
//	freopen ("111.in","r",stdin);
//	freopen ("111.out","w",stdout);
	scanf ("%d",&n);
	for (int i=1;i<n;i++){
		int x,y,kk;
		scanf ("%d %d %d",&x,&y,&kk);
		add(x+1,y+1,kk);
		add(y+1,x+1,kk);
	}
	scanf ("%d",&m);
	dfs1(1,0,1);
	dfs2(1,1);
	build (1,1,n);
	while (m--){
		string opt;
		cin>>opt;
		if (opt=="C"){
			int i,p;
			scanf ("%d %d",&i,&p);
			int x=e[i*2].u,y=e[i*2].v;
			if (fa[x]==y){
				change2(1,id[x],p);
			}
			else {
				change2(1,id[y],p);
			}
		}
		else if (opt=="N"){
			int x,y;
			scanf ("%d %d",&x,&y);
			crange(x+1,y+1);
		}
		else if (opt=="SUM"){
			int x,z;
			scanf ("%d %d",&x,&z);
			printf ("%d\n",qrange(x+1,z+1));
		}
		else if (opt=="MAX"){
			int x,y;
			scanf ("%d%d",&x,&y);
			printf ("%d\n",mxrange(x+1,y+1));
		}
		else {
			int x,y;
			scanf ("%d%d",&x,&y);
			printf ("%d\n",mirange(x+1,y+1));
		}
	}
	return 0;
}
2023/10/8 11:47
加载中...