爆零 10 WA+2 RE 树剖
查看原帖
爆零 10 WA+2 RE 树剖
668765
atom_yan楼主2022/10/14 20:17
#include<bits/stdc++.h>
using namespace std;
template <typename T>inline void read(T& t){
	t=0; register char ch=getchar(); register int fflag=1;
	while(!('0'<=ch&&ch<='9')){if(ch=='-') fflag=-1;ch=getchar();}
	while(('0'<=ch&&ch<='9')){t=t*10+ch-'0'; ch=getchar();} t*=fflag;
}
template <typename T,typename... Args> inline void read(T& t, Args&... args){read(t);read(args...);}
const int N=2e5+5;
int n,m;
int tot,head[N];
struct edge{
	int from,to,w,Next;
	void add(int u,int v,int _w){
		from=u,
		to=v,
		w=_w,
		Next=head[u],
		head[u]=tot;
	}
}e[N<<1];
struct Segment_Tree{
	int sum,MAX,MIN,ftag;
}tr[N<<2];
int siz[N],dep[N],fa[N],mson[N],w[N],dfn[N],top[N],cntt,tmp[N];
void dfs1(int u,int f){
	++siz[u],dep[u]=dep[f]+1,fa[u]=f;
	int MSON=-1;
	for(int i=head[u];i;i=e[i].Next){
		int v=e[i].to;
		if(v==f)continue;
		dfs1(v,u);
		tmp[v]=e[i].w,siz[u]+=siz[v];
		if(siz[v]>MSON)
			MSON=siz[v],mson[u]=v;
	}
}
void dfs2(int u,int t){
	dfn[u]=++cntt,w[cntt]=tmp[u],top[u]=t;
	if(mson[u])dfs2(mson[u],t);
	for(int i=head[u];i;i=e[i].Next){
		int v=e[i].to;
		if(v==fa[u]||v==mson[u])continue;
		dfs2(v,v);
	}
}
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
inline void push_up(int p){
	tr[p].sum=tr[ls(p)].sum+tr[rs(p)].sum;
	tr[p].MAX=max(tr[ls(p)].MAX,tr[rs(p)].MAX);
	tr[p].MIN=min(tr[ls(p)].MIN,tr[rs(p)].MIN);
}
inline void push_down(int p){
	if(tr[p].ftag){
		tr[ls(p)].ftag^=1;
		tr[ls(p)].sum=-tr[ls(p)].sum,
		swap(tr[ls(p)].MAX,tr[ls(p)].MIN);//tr[ls(p)].MAX^=tr[ls(p)].MIN^=tr[ls(p)].MAX^=tr[ls(p)].MIN;
		tr[ls(p)].MAX=-tr[ls(p)].MAX,tr[ls(p)].MIN=-tr[ls(p)].MIN;
		tr[rs(p)].ftag^=1;
		tr[rs(p)].sum=-tr[rs(p)].sum,
		swap(tr[rs(p)].MAX,tr[rs(p)].MIN);//tr[rs(p)].MAX^=tr[rs(p)].MIN^=tr[rs(p)].MAX^=tr[rs(p)].MIN;
		tr[rs(p)].MAX=-tr[rs(p)].MAX,tr[rs(p)].MIN=-tr[rs(p)].MIN;
		tr[p].ftag=0;
	}
}
void build(int p,int l,int r){
	if(l==r){
		tr[p]={w[l],w[l],w[l],0};
		return ;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}
void update1(int aim,int p,int l,int r,int k){
	if(l==r){
		tr[p].sum=tr[p].MAX=tr[p].MIN=k;
		tr[p].ftag=0;
		return ;
	}
	push_down(p);
	int mid=l+r>>1;
	if(aim<=mid)update1(aim,ls(p),l,mid,k);
	else update1(aim,rs(p),mid+1,r,k);
	push_up(p);
}
void update2(int al,int ar,int p,int l,int r){
	if(al<=l&&r<=ar){
		tr[p].sum=-tr[p].sum,
		swap(tr[p].MAX,tr[p].MIN);//tr[p].MAX^=tr[p].MIN^=tr[p].MAX^=tr[p].MIN;
		tr[p].MAX=-tr[p].MAX,tr[p].MIN=-tr[p].MIN;
		tr[p].ftag^=1;
		return ;
	}
	push_down(p);
	int mid=(l+r)>>1;
	if(al<=mid)update2(al,ar,ls(p),l,mid);
	if(mid<ar)update2(al,ar,rs(p),mid+1,r);
	push_up(p);
}
void update_rank(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])x^=y^=x^=y;
		update2(dfn[top[x]],dfn[x],1,1,n);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])x^=y^=x^=y;
	update2(dfn[y],dfn[mson[x]],1,1,n);
}
int query_sum(int al,int ar,int p,int l,int r){
	if(al<=l&&r<=ar)
		return tr[p].sum;
	int ans=0,mid=l+r>>1;
	push_down(p);
	if(al<=mid)ans+=query_sum(al,ar,ls(p),l,mid);
	if(mid<ar)ans+=query_sum(al,ar,rs(p),mid+1,r);
	return ans;
}
int query_MAX(int al,int ar,int p,int l,int r){
	if(al<=l&&r<=ar)
		return tr[p].MAX;
	int ans=0,mid=l+r>>1;
	push_down(p);
	if(al<=mid)ans=max(ans,query_MAX(al,ar,ls(p),l,mid));
	if(mid<ar)ans=max(ans,query_MAX(al,ar,rs(p),mid+1,r));
	return ans;
}
int query_MIN(int al,int ar,int p,int l,int r){
	if(al<=l&&r<=ar)
		return tr[p].MIN;
	int ans=0x3f3f3f3f,mid=l+r>>1;
	push_down(p);
	if(al<=mid)ans=min(ans,query_MIN(al,ar,ls(p),l,mid));
	if(mid<ar)ans=min(ans,query_MIN(al,ar,rs(p),mid+1,r));
	return ans;
}
int query_rank_sum(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])x^=y^=x^=y;
		ans+=query_sum(dfn[top[x]],dfn[x],1,1,n);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])x^=y^=x^=y;
	ans+=query_sum(dfn[mson[y]],dfn[x],1,1,n);
	return ans;
}
int query_rank_MAX(int x,int y){
	int ans=0xcfcfcfcf;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])x^=y^=x^=y;
		ans=max(ans,query_MAX(dfn[top[x]],dfn[x],1,1,n));
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])x^=y^=x^=y;
	ans=max(ans,query_MAX(dfn[mson[y]],dfn[x],1,1,n));
	return ans;
}
int query_rank_MIN(int x,int y){
	int ans=0x3f3f3f3f;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);//x^=y^=x^=y;
		ans=min(ans,query_MIN(dfn[top[x]],dfn[x],1,1,n));
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])swap(x,y);//x^=y^=x^=y;
	ans=min(ans,query_MIN(dfn[mson[x]],dfn[y],1,1,n));
	return ans;
}
int main(){
	// std::ios::sync_with_stdio(false);
	// std::cin.tie(0);
	read(n);
	for(int i=1;i<n;++i){
		int u,v,w;
		read(u,v,w);
		e[++tot].add(u,v,w);
		e[++tot].add(v,u,w);
	}
	dfs1(1,N-1);
	dfs2(1,1);
	build(1,1,n);
	read(m);
	while(m--){
		string opt;
		cin>>opt;
		int x,y;
		read(x,y);
		if(opt=="SUM")
			printf("%d\n",query_rank_sum(x,y));
		else if(opt=="MIN")
			printf("%d\n",query_rank_MIN(x,y));
		else if(opt=="MAX")
			printf("%d\n",query_rank_MAX(x,y));
		else if(opt=="C")
			update1(dep[e[x<<1].from]<dep[e[x<<1].to]?dfn[e[x<<1].to]:dfn[e[x<<1].to],1,1,n,y);
		else
			update_rank(x,y);
	}
	return 0;
}
2022/10/14 20:17
加载中...