主席树TLE2,3求助
查看原帖
主席树TLE2,3求助
672877
elswzl楼主2023/8/9 08:15
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,q,cnt;
int a[N],b[N];
int head[N],tot;
int dep[N],fa[N][25],root[N];
struct node{
	int next,to;
}e[N<<1];
void add(int from,int to){
	e[++tot].next=head[from];head[from]=tot;e[tot].to=to;
}
struct TREE{
	int l,r,lson,rson,sum;
}t[N*30];
void push_up(int p){
	t[p].sum=t[t[p].lson].sum+t[t[p].rson].sum;
}
void build(int &p,const int &l,const int &r){
	p=++cnt;t[p].l=l;t[p].r=r;if(l==r)return ;
	int mid=l+r>>1;
	build(t[p].lson,l,mid);build(t[p].rson,mid+1,r);
	push_up(p);
}
void adds(int &p,const int &pre,const int &l,const int &r,const int &X,const int &d){
	p=++cnt;t[p]=t[pre];
	if(l==r){
		t[p].sum+=d;return ;
	}
	int mid=t[p].l+t[p].r>>1;
	if(mid>=X){
		adds(t[p].lson,t[pre].lson,l,mid,X,d);t[p].rson=t[pre].rson;
	}
	else{
		adds(t[p].rson,t[pre].rson,mid+1,r,X,d);t[p].lson=t[pre].lson;
	}
	push_up(p);
}
int query(const int &L,const int &R,const int &p){
	if(t[p].l>=L&&t[p].r<=R)return t[p].sum;
	int mid=t[p].l+t[p].r>>1;
	int ret=0;
	if(mid>=L)ret+=query(L,R,t[p].lson);
	if(mid<R)ret+=query(L,R,t[p].rson);
	push_up(p);
	return ret;
}
void dfs(int x,int _fa){
	dep[x]=dep[_fa]+1;
	fa[x][0]=_fa;
	for(int i=1;i<=20;i++)fa[x][i]=fa[fa[x][i-1]][i-1];
	adds(root[x],root[_fa],1,n,a[x],1);
	for(int i=head[x];i;i=e[i].next){
		int y=e[i].to;if(y==_fa)continue;
		dfs(y,x);
	}
}
int lca(int a,int b){
	if(dep[a]<dep[b])swap(a,b);
	
	for(int i=20;i>=0;i--)if(dep[fa[a][i]]>=dep[b])a=fa[a][i];
	if(a==b)return a;
	for(int i=20;i>=0;i--){
		if(fa[a][i]!=fa[b][i]){
			a=fa[a][i];b=fa[b][i];
		}
	}
	return fa[a][0];
}
signed main(){
	cin>>n>>q;build(root[0],1,n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);b[i]=a[i];
	}sort(b+1,b+n+1);
	for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+n+1,a[i])-b;
	for(int i=1;i<n;i++){
		int u,v;scanf("%d%d",&u,&v);add(u,v);add(v,u);
	}
	dfs(1,0);
	int last=0;
	while(q--){
		int u,v,k;scanf("%d%d%d",&u,&v,&k);u=u^last;
		if(u>n||u<=0)continue;
		int LCA=lca(u,v);
		int p=0;
		for(int i=1<<20;i;i>>=1){
			if(p+i<=n&&query(1,p+i,root[v])+query(1,p+i,root[u])-query(1,p+i,root[LCA])-query(1,p+i,root[fa[LCA][0]])<k){
				p+=i;
			}
		}p++;
		last=b[p];printf("%d\n",last);
		
	}
	return 0;
}

哪位大佬能指点一下如何降常数吗?

2023/8/9 08:15
加载中...