萌新求助树剖,吸氧AC,不吸氧爆零
查看原帖
萌新求助树剖,吸氧AC,不吸氧爆零
226113
火羽白日生楼主2021/9/15 09:36

rt,不知道是哪里写假了

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define rint register int
using namespace std;
namespace IO{
	#define File(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
	#define FileClose() fclose(stdin),fclose(stdout)
	inline int read(){
		int w=0,f=1; char ch=getchar();
		while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
		while(ch>='0'&&ch<='9'){w=(w<<3)+(w<<1)+(ch^48); ch=getchar();}
		return w*f;
	}
	inline void write(int x,char ch='\n'){
  		static int sta[35]; int top=0;
  		if(x<0) putchar('-'),x=-x;
  		do{sta[++top]=x%10,x/=10;}while(x);
  		while(top) putchar(sta[top--]+48); putchar(ch);
	}
}
using namespace IO;
namespace CL{
	#define fill(x,y) memset(x,y,sizeof(x))
	#define copy(x,y) memcpy(x,y,sizeof(y))
	
	const int maxn=2e5+5; const ll inf=0x7ffffffffffffff;
	
	int n,m;
	ll val[maxn]; int uid[maxn];
	char s[5];
	struct data{int u,v;}a[maxn];
	namespace Graph{
		int head[maxn],id;
		struct e{int v,w,next;}edge[maxn<<1];
		inline void add(int u,int v,int w){
			edge[++id]=(e){v,w,head[u]};
			head[u]=id;
		}
	}using namespace Graph;
	namespace SegmentTree{
		#define lson p<<1
		#define rson p<<1|1
		struct node{
			ll sum,mx,mn,tag;
			node(){}
			node(ll a,ll b,ll c){sum=a,mx=b,mn=c;}
			inline void get(ll x){sum=mx=mn=x,tag=0;}
			inline void rev(){tag^=1,sum=-sum,mx=-mx,mn=-mn,swap(mx,mn);}
			inline node operator +(const node &x)const{
				return node(sum+x.sum,max(mx,x.mx),min(mn,x.mn));
			}	
		}t[maxn<<2];
		inline void pushup(int p){t[p]=t[lson]+t[rson];}
		inline void pushdown(int p){
			if(t[p].tag){
				t[lson].rev(),t[rson].rev();
				t[p].tag=0;
			}
		}
		void build(int p,int l,int r){
			if(l==r) return t[p].get(val[uid[l]]),void();
			int mid=(l+r)>>1;
			build(lson,l,mid),build(rson,mid+1,r);
			pushup(p);
		}
		void modify(int p,int l,int r,int pos,ll k){
			if(l==r) return t[p].get(k),void();
			pushdown(p);
			int mid=(l+r)>>1;
			if(pos<=mid) modify(lson,l,mid,pos,k);
			else modify(rson,mid+1,r,pos,k);
			pushup(p);
		}
		void update(int p,int l,int r,int tl,int tr){
			if(tl<=l && r<=tr) return t[p].rev(),void();
			pushdown(p);
			int mid=(l+r)>>1;
			if(tl<=mid) update(lson,l,mid,tl,tr);
			if(tr>mid) update(rson,mid+1,r,tl,tr);
			pushup(p);
		}
		node query(int p,int l,int r,int tl,int tr){
			if(tl<=l && r<=tr) return t[p];
			pushdown(p);
			int mid=(l+r)>>1; node res=node(0,-inf,inf);
			if(tl<=mid) res=res+query(lson,l,mid,tl,tr);
			if(tr>mid) res=res+query(rson,mid+1,r,tl,tr);
			return res;
		}
	}using namespace SegmentTree;
	namespace TreeChain{
		int dep[maxn],size[maxn],f[maxn],son[maxn],top[maxn],dfn[maxn],tim;
		void dfs1(int u,int fa){
			f[u]=fa,size[u]=1;
			dep[u]=dep[fa]+1;
			for(int i=head[u];i;i=edge[i].next){
				int v=edge[i].v,w=edge[i].w;
				if(v==fa) continue;
				val[v]=w;
				dfs1(v,u);
				size[u]+=size[v];
				if(size[v]>size[son[u]]) son[u]=v;
			}
		}
		void dfs2(int u,int topf){
			top[u]=topf;
			dfn[u]=++tim,uid[tim]=u;
			if(!son[u]) return;
			dfs2(son[u],topf);
			for(int i=head[u];i;i=edge[i].next){
				int v=edge[i].v;
				if(v==f[u] || v==son[u]) continue;
				dfs2(v,v);
			}
		}
		inline void uprange(int x,int y){
			while(top[x]!=top[y]){
				if(dep[top[x]]<dep[top[y]]) swap(x,y);
				update(1,1,n,dfn[top[x]],dfn[x]);
				x=f[top[x]];
			}
			if(dep[x]>dep[y]) swap(x,y);
			if(x!=y) update(1,1,n,dfn[x]+1,dfn[y]);
		}
		inline node qrange(int x,int y){
			node res=node(0,-inf,inf);
			while(top[x]!=top[y]){
				if(dep[top[x]]<dep[top[y]]) swap(x,y);
				res=res+query(1,1,n,dfn[top[x]],dfn[x]);
				x=f[top[x]];
			}
			if(dep[x]>dep[y]) swap(x,y);
			if(x!=y) res=res+query(1,1,n,dfn[x]+1,dfn[y]);
			return res;
		}
	}using namespace TreeChain;
	
	inline int main(){
		n=read();
		for(int i=1;i<n;i++){
			int x=read()+1,y=read()+1,z=read();
			add(x,y,z),add(y,x,z);
			a[i]=(data){x,y};
		}
		dfs1(1,0),dfs2(1,1),build(1,1,n);
		m=read();
		while(m--){
			scanf("%s",s+1); int x=read(),y=read();
			if(s[1]=='C') modify(1,1,n,dep[a[x].u]>dep[a[x].v]?dfn[a[x].u]:dfn[a[x].v],y);
			else{
				x++,y++; node res=qrange(x,y);
				if(s[1]=='N') uprange(x,y);
				if(s[1]=='S') printf("%lld\n",res.sum);
				if(s[1]=='M' && s[2]=='A') printf("%lld\n",res.mx);
				if(s[1]=='M' && s[2]=='I') printf("%lld\n",res.mn);
			}
		}
		return 0;
	}
}
signed main(){return CL::main();}
2021/9/15 09:36
加载中...