树剖代码样例过0pts求调
查看原帖
树剖代码样例过0pts求调
935908
zengziqvan楼主2024/8/12 17:23
#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
//#define int long long
//#define double long double
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define ROF(i,r,l) for(int i=r;i>=l;--i)
#define mkp make_pair
#define fr first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
using namespace std;
void IOS() {
	ios::sync_with_stdio(false);
	cin.tie(0);
}
void Document() {
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
}
inline int read(){
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}
	return s*w;
}
inline void write(int x){
	if(x<0){putchar('-');x=-x;}
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
void Tell() {
	//写数据结构注意初始化!
	//浮点数类题目过不了优先考虑精度!
	//vector动态开点注意内存重分配!
	//有本地写freopen!没本地别写!!!
	//最后几分钟给我老老实实坐那里,别手贱!!!
	//long long 级别的常数运算一定要用 xll!!!
	//一定要手玩几组极限数据,防止爆数。
	//大数据关同步流! 大数据关同步流! 大数据关同步流!
	//删调试!删调试!删调试!删调试!删调试!
	//注意数据类型!注意数据类型!注意数据类型!不要把存 int 的数组开成 char 类型!
	//注意数组大小的上界,不要把 5e6 打成 6e5!
}
const int N=1e5+10;
int n,top[N],id[N],rk[N],dep[N],a[N],tot,dp[N][30],lg,m,hed[N],son[N],eg[N],siz[N];
struct edge {
	int nxt,to,val,id;
}e[N<<1];
void adde(int u,int v,int w,int id) {
	e[++tot]={hed[u],v,w,id};
	hed[u]=tot;
}
void dfs1(int x,int fa) {
	dp[x][0]=fa;
	dep[x]=dep[fa]+1;siz[x]=1;
	for(int i=1;i<=lg;++i) dp[x][i]=dp[dp[x][i-1]][i-1];
	for(int i=hed[x];i;i=e[i].nxt) {
		int y=e[i].to,id=e[i].id;
		if(y==fa) continue;
		eg[id]=y;a[y]=e[i].val;
		dfs1(y,x);
		siz[x]+=siz[y];
		if(siz[son[x]]<siz[y]) son[x]=y;
	}
}
void dfs2(int x,int tp) {
	top[x]=tp;
	id[++m]=x;
	rk[x]=m;
	if(!son[x]) return ;
	dfs2(son[x],tp);
	for(int i=hed[x];i;i=e[i].nxt) {
		int y=e[i].to;
		if(y==dp[x][0]||y==son[x]) continue;
		dfs2(y,y);
	}
}
int Lca(int x,int y) {
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=lg;~i;--i) if(dep[dp[x][i]]>=dep[y]) x=dp[x][i];
	if(x==y) return x;
	for(int i=lg;~i;--i) if(dp[x][i]!=dp[y][i]) x=dp[x][i],y=dp[y][i];
	return dp[x][0];
}
struct SegmentTree {
	int l,r,len;
	int Max,add,cov;
}t[N<<2];
void push_up(int p) {
	t[p].Max=max(t[p<<1].Max,t[p<<1|1].Max);
}
void push_down(int p) {
	if(~t[p].cov) {
		t[p<<1].add=t[p<<1|1].add=0;
		t[p<<1].cov=t[p<<1|1].cov=t[p<<1].Max=t[p<<1|1].Max=t[p].cov;
		t[p].cov=-1;
	}
	if(t[p].add) {
		if(~t[p<<1].cov) t[p<<1].cov+=t[p].add;
		else t[p<<1].add+=t[p].add;
		if(~t[p<<1|1].cov) t[p<<1|1].cov+=t[p].add;
		else t[p<<1|1].add+=t[p].add;
		t[p<<1].Max+=t[p].add;
		t[p<<1|1].Max+=t[p].add; 
		t[p].add=0;
	} 
}
void Build(int p,int l,int r) {
	t[p].l=l,t[p].r=r,t[p].len=r-l+1;t[p].cov=-1;
	if(l==r) {
		t[p].Max=a[rk[l]];
		return ;
	}
	int mid=l+r>>1;
	Build(p<<1,l,mid);
	Build(p<<1|1,mid+1,r);
	push_up(p);
}
void cover(int p,int l,int r,int v) {
	if(l<=t[p].l&&t[p].r<=r) {
		t[p].add=0;
		t[p].cov=v;
		t[p].Max=v;
		return ;
	}
	push_down(p);
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid) cover(p<<1,l,r,v);
	if(r>mid) cover(p<<1|1,l,r,v);
	push_up(p);
}
void add(int p,int l,int r,int v) {
	if(l<=t[p].l&&t[p].r<=r) {
		if(~t[p].cov) t[p].cov+=v;
		else t[p].add+=v;
		t[p].Max+=v;
		return ;
	}
	push_down(p);
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid) add(p<<1,l,r,v);
	if(r>mid) add(p<<1|1,l,r,v);
	push_up(p);
}
int ask(int p,int l,int r) {
	if(l<=t[p].l&&t[p].r<=r) return t[p].Max;
	push_down(p);
	int mid=t[p].l+t[p].r>>1,val=-1e9;
	if(l<=mid) cmax(val,ask(p<<1,l,r));
	if(r>mid) cmax(val,ask(p<<1|1,l,r));
	return val;
}
int Tree_ask(int x,int y) {
	int res=-1e9;
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		cmax(res,ask(1,id[top[x]],id[x]));
		x=dp[top[x]][0];
	}
	if(dep[x]>dep[y]) swap(x,y);
	cmax(res,ask(1,id[x],id[y]));
	return res;
}
void Tree_cover(int x,int y,int v) {
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		cover(1,id[top[x]],id[x],v);
		x=dp[top[x]][0];
	}
	if(dep[x]>dep[y]) swap(x,y);
	cover(1,id[x],id[y],v);
}
void Tree_add(int x,int y,int v) {
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		add(1,id[top[x]],id[x],v);
		x=dp[top[x]][0];
	}
	if(dep[x]>dep[y]) swap(x,y);
	add(1,id[x],id[y],v);
}
main() {
	cin>>n;
	lg=log(n)/log(2);
	FOR(i,1,n-1) {
		int u=read(),v=read(),w=read();
		adde(u,v,w,i);
		adde(v,u,w,i);
	}
	dfs1(1,0);dfs2(1,1);
	Build(1,1,n);
	string s;
	while(cin>>s&&s!="Stop") {
		int k,u,v,w;
		if(s=="Change") {
			k=read(),w=read();
			int x=eg[k];
			cover(1,id[x],id[x],w); 
		} 
		if(s=="Cover") {
			u=read(),v=read(),w=read();
			int lca=Lca(u,v);
			int val_lca=Tree_ask(lca,lca);
			Tree_cover(u,v,w);
			Tree_cover(lca,lca,val_lca);
		} 
		if(s=="Add") {
			u=read(),v=read(),w=read();
			int lca=Lca(u,v);
			Tree_add(u,v,w);
			Tree_add(lca,lca,-w);
		} 
		if(s=="Max") {
			u=read(),v=read();
			int lca=Lca(u,v);
			int val_lca=Tree_ask(lca,lca);
			Tree_cover(lca,lca,-1e9);
			cout<<Tree_ask(u,v)<<"\n";
			Tree_cover(lca,lca,val_lca);
		} 
	}
	return 0;
}
2024/8/12 17:23
加载中...