树剖10TLE0分求助
查看原帖
树剖10TLE0分求助
365110
xuanyuan_Niubi楼主2021/3/19 20:02

实测开O2有60分(还有4个T),但是树剖就是这么写的啊为什么会TLE呢,

#include<cstdio>
#define max(a,b) (a>b?a:b)
#define swap(a,b) (a^=b^=a^=b)
using namespace std;
const int M=1e5+5;
inline int read(){
	char c=getchar();int x=0,f=1;
	for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
	for(;c<='9'&&c>='0';c=getchar())x=(x<<1)+(x<<3)+(c^48);
	return f=-1?-x:x;
}
inline void print(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)print(x/10);
	putchar(x%10+48);
}
int n,m,w[M];
//=======================================================
struct edge{
	int v,nxt;
}ed[M];
int head[M],cnt_edge;
inline void add_edge(int u,int v){
	ed[++cnt_edge]=(edge){v,head[u]};
	head[u]=cnt_edge;
}
//======================================================
int size[M],dep[M],son[M],fa[M],id[M],wt[M],top[M],cnt_id;
inline void dfs1(int u,int f,int deep){
	dep[u]=deep,fa[u]=f,size[u]=1;
	int maxson=-1;
	for(int i=head[u];i;i=ed[i].nxt){
		int v=ed[i].v;
		if(v!=f){
			dfs1(v,u,deep+1);
			size[u]+=size[v];
			size[v]>maxson?maxson=size[v],son[u]=v:1;
		}
	}
}
inline void dfs2(int u,int topf){
	top[u]=topf,id[u]=++cnt_id,wt[cnt_id]=w[u];
	if(son[u]){
		dfs2(son[u],topf);
		for(int i=head[u];i;i=ed[i].nxt){
			int v=ed[i].v;
			if(v!=fa[u]&&v!=son[u]){
				dfs2(v,v);
			}
		}
	}
}
//======================================================
struct tree{
	int l,r,v,x;//x是最大值,v是和 
}t[M<<2];
inline void push_up(int k){
	t[k].v=t[k<<1].v+t[k<<1|1].v;
	t[k].x=max(t[k<<1].x,t[k<<1|1].x);
}
inline void build(int l,int r,int k){
	t[k].l=l;
	t[k].r=r;
	if(l==r){
		t[k].x=t[k].v=wt[l];
		return ;
	}
	int mid=l+r>>1;
	build(l,mid,k<<1);
	build(mid+1,r,k<<1|1);
	push_up(k);
}
inline void update(int v,int x,int k){
	if(t[k].l==t[k].r&&t[k].l==x){
		t[k].v=v;
		t[k].x=v;
		return ;
	}
	int mid=t[k].l+t[k].r>>1;
	if(x<=mid)update(v,x,k<<1);
	else update(v,x,k<<1|1);
	push_up(k);
}
inline int query_sum(int l,int r,int k){
	if(l<=t[k].l&&t[k].r<=r){
		return t[k].v;
	}
	int ans=0;
	int mid=t[k].l+t[k].r>>1;
	if(l<=mid)ans+=query_sum(l,r,k<<1);
	if(r>mid)ans+=query_sum(l,r,k<<1|1);
	return ans;
}
inline int query_max(int l,int r,int k){
	if(l<=t[k].l&&t[k].r<=r){
		return t[k].x;
	}
	int ans=-0x3f3f3f3f;
	int mid=t[k].l+t[k].r>>1;
	if(l<=mid)ans=max(ans,query_max(l,r,k<<1));
	if(r>mid)ans=max(ans,query_max(l,r,k<<1|1));
	return ans;
}
//======================================================
inline int query_range_sum(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]){
			swap(x,y);
		}
		ans+=query_sum(id[top[x]],id[x],1);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	} 
	ans+=query_sum(id[x],id[y],1);
	return ans;
}
inline int query_range_max(int x,int y){
	int ans=-0x3f3f3f3f;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]){
			swap(x,y);
		}
		ans=max(ans,query_max(id[top[x]],id[x],1));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	ans=max(ans,query_max(id[x],id[y],1));
	return ans;
}
//======================================================
int main(){
	n=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add_edge(u,v),add_edge(v,u);
	}
	for(int i=1;i<=n;i++)w[i]=read();
	dfs1(1,0,1);
	dfs2(1,1);
	build(1,cnt_id,1);
	m=read();
	for(int i=1;i<=m;i++){
		char s[10];
		scanf("%s",s);
		if(s[1]=='M'){
			int x=read(),y=read();
			print(query_range_max(x,y)),puts("");
		}
		else if(s[1]=='S'){
			int x=read(),y=read();
			print(query_range_sum(x,y)),puts("");
		}
		else {
			int x=read(),v=read();
			update(v,id[x],1);
		}
	}
	return 0;
}
2021/3/19 20:02
加载中...