树套树MLE求助
查看原帖
树套树MLE求助
494601
gcx12012楼主2024/1/9 14:21

计算过了内存,大概242MB,但是全MLE

#include<bits/stdc++.h>
#include<cmath>
#define ll long long
#define ull unsigned long long
#define ld long double
#define N 100010
#define For(i,a,b) for(ll i=a;i<=b;i++)
#define Rof(i,a,b) for(ll i=a;i>=b;i--)
#define ls x<<1
#define rs x<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r
#define pb push_back
#define mk make_pair
#define pii pair<ll,ll>
#define pque priority_queue
#define lll __int128

using namespace std;
bool st;
vector<int >e[N];
int a[N];
int n,q;

ll read(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int dfn[N],f[N][20],sz[N],top[N],son[N],dep[N],cnt=0;
void dfs1(int u,int fa){
	dep[u]=dep[fa]+1;
	sz[u]=1;
	f[u][0]=fa;
	For(i,1,19) f[u][i]=f[f[u][i-1]][i-1];
	for(int v:e[u]){
		if(v==fa) continue;
		dfs1(v,u);
		sz[u]+=sz[v];
		if(sz[v]>sz[son[u]]) son[u]=v;
	}
} 
void dfs2(int u,int tp){
	dfn[u]=++cnt;
	top[u]=tp;
	if(son[u]) dfs2(son[u],tp);
	for(int v:e[u]){
		if(v==f[u][0] || v==son[u]) continue;
		dfs2(v,v);
	}
}
int rt[N<<2],to[300*N][2],tot=0;
void add(int now,int x){
	Rof(i,29,0){
		int p=(x>>i)&1;
		if(!to[now][p]) to[now][p]=++tot;
		now=to[now][p];
	}
}
void build(int x,int l,int r,int u,int v){
	add(x,v);
	if(l==r) return;
	int mid=(l+r)>>1;
	if(u<=mid) build(lson,u,v);
	else build(rson,u,v);
}
int qry2(int now,int x){
	int ans=0;
	Rof(i,29,0){
		int p=(x>>i)&1;
		if(to[now][p^1]){
			now=to[now][p^1];
			ans+=(1<<i);
		}else if(to[now][p]) now=to[now][p];
		else break;
	}
	return ans;
}
int qry(int x,int l,int r,int L,int R,int u){
	if(L<=l && r<=R) return qry2(x,u);
	int mid=(l+r)>>1,ans=0;
	if(L<=mid) ans=max(ans,qry(lson,L,R,u));
	if(R>mid) ans=max(ans,qry(rson,L,R,u));
	return ans;
}
int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	Rof(i,19,0) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	Rof(i,19,0) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}
int sol(int x,int y,int z){
	int ans=0,fu=lca(x,y);
	//cout<<fu<<endl;
	while(top[fu]!=top[x]){
		int now=f[top[x]][0];
		ans=max(ans,qry(1,1,n,dfn[top[x]],dfn[x],z));
		x=now;
	}
	ans=max(ans,qry(1,1,n,dfn[fu],dfn[x],z));
	while(top[fu]!=top[y]){
		int now=f[top[y]][0];
		ans=max(ans,qry(1,1,n,dfn[top[y]],dfn[y],z));
		y=now;
	}
	ans=max(ans,qry(1,1,n,dfn[fu],dfn[y],z));
	return ans;
}
bool ed;

int main()
{
	n=read(),q=read();
	For(i,1,n) a[i]=read();
	For(i,1,n-1){
		int u=read(),v=read();
		e[u].pb(v);
		e[v].pb(u);
	}
	dfs1(1,0);
	dfs2(1,1);
	For(i,1,n*4) rt[i]=i;
	tot=n*4;
	For(i,1,n) build(1,1,n,dfn[i],a[i]);
	//For(i,1,n) cout<<dfn[i]<<' ';
	//cout<<endl;
	while(q--){
		int op=read(),x=read(),y=read(),z;
		if(op==1) printf("%d\n",qry(1,1,n,dfn[x],dfn[x]+sz[x]-1,y));
		else{
			z=read();
			printf("%d\n",sol(x,y,z));
		}
	}
	//fprintf(stderr,"%d\n",(&ed-&st)/1024/1024);
    return 0;
}
2024/1/9 14:21
加载中...