「ZJOI2008」树的统计 20分代码求调
  • 板块学术版
  • 楼主LBY1145141919810
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/30 12:35
  • 上次更新2024/11/30 14:38:00
查看原帖
「ZJOI2008」树的统计 20分代码求调
1387479
LBY1145141919810楼主2024/11/30 12:35

果然,还是,挂掉了。

只好抄教练的模板 QwQ

自己写的代码:

#include<stdio.h>
const int N=3e5+1;
int head[N],to[N],nex[N],w[N],tad=0;
inline void mkr(const int u,const int v){to[++tad]=v,nex[tad]=head[u],head[u]=tad;}
int siz[N],top[N],son[N],in[N],rev[N],dep[N],fa[N],tot=0;
int n;
const int MAX=(1u<<31)-1,MIN=(1u<<31);
void dfs1(const int u,const int Fa){
	siz[u]=1;
	fa[u]=Fa;
	dep[u]=dep[Fa]+1;
	for(register int i=head[u];i;i=nex[i]){
		const int t=to[i];
		if(t!=Fa){
			dfs1(t,u);
			siz[u]+=siz[t];
			if(siz[son[u]]<siz[t])son[u]=t;
		}
	} 
}
void dfs2(const int u,const int Fa){
	if(son[u]){
		in[son[u]]=++tot;
		rev[tot]=son[u];
		top[son[u]]=top[u];
		dfs2(son[u],u);
	}
	for(register int i=head[u];i;i=nex[i]){
		const int t=to[i];
		if(t!=Fa&&t!=son[u]){
			in[t]=++tot;
			rev[tot]=t;
			top[t]=t;
			dfs2(t,u);
		}
	}
}
inline void init(){
	dfs1(1,0);
	in[1]=++tot;
	rev[tot]=1;
	top[1]=1;
	dfs2(1,0);
}
inline void maxs(int &a,register const int b){a=(a>b)?a:b;}
inline int max(register const int a,register const int b){return (a>b)?a:b;}
inline void mins(int &a,register const int b){a=(a<b)?a:b;}
inline int min(register const int a,register const int b){return (a<b)?a:b;}
inline void swap(int &a,int &b){int t=a;a=b,b=t;}
struct __{
	int val_max,val_sum;
};
class ___{
	private:
		__ tr[N<<2];
	public:
		void built(int k,int l,int r){
			if(l==r){
				tr[k].val_max=w[rev[l]];
				tr[k].val_sum=w[rev[l]];
				return;
			}
			int mid=(l+r)>>1;
			built(k*2,l,mid);
			built(k*2+1,mid+1,r);
			tr[k].val_max=max(tr[k*2].val_max,tr[k*2+1].val_max);
			tr[k].val_sum=tr[k*2].val_sum+tr[k*2+1].val_sum;
		}
		int get_sum(int k,int l,int r,int x,int y){
			if(x<=l&&r<=y){
				return tr[k].val_sum;
			}
			int mid=(l+r)>>1;
			int Sum=0;
			if(x<=mid){
				Sum+=get_sum(k*2,l,mid,x,y);
			}
			if(y>mid){
				Sum+=get_sum(k*2+1,mid+1,r,x,y);
			}
			return Sum;
		}
		int get_max(int k,int l,int r,int x,int y){
			if(x<=l&&r<=y){
				return tr[k].val_max;
			}
			int mid=(l+r)>>1;
			int Max=MIN;
			if(x<=mid){
				maxs(Max,get_max(k*2,l,mid,x,y));
			}
			if(y>mid){
				maxs(Max,get_max(k*2+1,mid+1,r,x,y));
			}
			return Max;
		}
		void change(int k,int l,int r,int x,int Val){
			if(l==x&&x==r){
				tr[k].val_max=Val;
				tr[k].val_sum=Val;
				return ;
			}
			int mid=(l+r)>>1;
			if(x<=mid){
				change(k*2,l,mid,x,Val);
			}else{
				change(k*2+1,mid+1,r,x,Val);
			}
			tr[k].val_max=max(tr[k*2].val_max,tr[k*2+1].val_max);
			tr[k].val_sum=tr[k*2].val_sum+tr[k*2+1].val_sum;
		}
		
};
___ ____;
inline int Get_max(int x,int y){
	int Max=MIN;
	int fx=top[x],fy=top[y];
	while(fx!=fy){
		if(dep[fx]<dep[fy]){
			swap(x,y);
			swap(fx,fy);
		}
		maxs(Max,____.get_max(1,1,n,in[fx],in[x]));
		x=fa[fx],fx=top[x];
	}
  maxs(Max,____.get_max(1,1,n,min(in[x],in[y]),max(in[x],in[y])));
	return Max;
}
inline int Get_sum(int x,int y){
	int Sum=0;
	int fx=top[x],fy=top[y];
	while(fx!=fy){
		if(dep[fx]<dep[fy]){
			swap(x,y);
			swap(fx,fy);
		}
		Sum+=____.get_sum(1,1,n,in[fx],in[x]);
		x=fa[fx],fx=top[x];
	}
	Sum+=____.get_sum(1,1,n,min(in[x],in[y]),max(in[x],in[y]));
	return Sum;
}
int l,b,f,fnn;
char klee[15],y;
int main(){
	scanf("%d",&n);
	for(register int i=1;i<n;i++){
		scanf("%d%d",&l,&b);
		mkr(l,b);
		mkr(b,l);
	}
	init();
	for(register int i=1;i<=n;i++){
		scanf("%d",&w[i]);
	}
	____.built(1,1,n);
	scanf("%d",&f);
	while(f--){
		fnn=0;
		y=getchar();
		while(y!='Q'&&y!='C'){
			y=getchar();
		}
		klee[fnn++]=y;
		while(y>='A'&&y<='Z'){
			y=getchar();
			klee[fnn++]=y;
		}
		scanf("%d%d",&l,&b);
		if(klee[1]=='M'){
			printf("%d\n",Get_max(l,b));
		}else if(klee[1]=='S'){
			printf("%d\n",Get_sum(l,b));
		}else{
			____.change(1,1,n,l,b);
		}
	}
    return 0;
}

哪位大佬帮帮忙~~(就是码风有亿些抽象)~~

2024/11/30 12:35
加载中...