一个小问题
查看原帖
一个小问题
284715
遮云壑楼主2021/10/10 15:04

大佬们帮忙找找不同吧,初学可持久化trie,基本是对着第一篇题解写的,就是变量换了个名字,一直在WA,不知道哪里错了。空间已经开很大了,不知道为什么开10倍空间能多对两个点。

#include<bits/stdc++.h>
#define N 1000010
using namespace std;
inline void read(int& x)
{
	x=0;int y=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')y=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	x=x*y;
}

int n,q;
struct node{
	int to,nxt;
}e[N<<1];
int tot,head[N];
inline void add(int u,int v)
{
	e[++tot].nxt=head[u];
	e[tot].to=v;
	head[u]=tot;
}
int w[N],dfn[N],tim,lst[N],rt1[N],rt2[N];
int f[N][21],ch[20000001][2],sz[N],dep[N];

int cnt;
void insert(int &rt,int val,int j)
{
	ch[++cnt][1]=ch[rt][1],ch[cnt][0]=ch[rt][0];
	sz[cnt]=sz[rt]+1;
	rt=cnt;
	if(j!=-1)insert(ch[rt][val>>j&1],val,j-1);
}

void dfs(int x,int fa)
{
	dfn[x]=++tim,f[x][0]=fa,dep[x]=dep[fa]+1;
	rt1[tim]=rt1[tim-1],rt2[x]=rt2[fa];
	insert(rt1[tim],w[x],29);
	insert(rt2[x],w[x],29);
	for(int i=1;i<=20;i++)f[x][i]=f[f[x][i-1]][i-1];
	for(int i=head[x];i;i=e[i].nxt)
	{
		int y=e[i].to;
		if(y==fa)continue;
		dfs(y,x);
	}
	lst[x]=tim;
}

inline int lca(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	for(int i=20;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i];
	if(x==y)return x;
	for(int i=20;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
	return f[x][0];
}

int query(int r1,int r2,int val,int j)
{
	if(j==-1)return 0;
	int pos=(val>>j&1)^1;
	if(sz[ch[r1][pos]]-sz[ch[r2][pos]])return query(ch[r1][pos],ch[r2][pos],val,j-1)|(1<<j);
	else return query(ch[r1][pos^1],ch[r2][pos^1],val,j-1);
}
inline int Max(int x, int y) { return x > y ? x : y; }

int main(){
	read(n),read(q);
	for(int i=1;i<=n;i++)read(w[i]);
	for(int i=1,x,y;i<n;i++)
	{
		read(x),read(y);
		add(x,y),add(y,x);
	}
	dfs(1,0);
	for(int i=1;i<=q;i++)
	{
		int op,x,y,z;
		read(op);
		if(op==1)
		{
			read(x),read(z);
			printf("%d\n",query(rt1[lst[x]],rt1[dfn[x]-1],z,29));
		}
		if(op==2)
		{
			read(x),read(y),read(z);
			int L=f[lca(x,y)][0];
			printf("%d\n",Max(query(rt2[x],rt2[L],z,29),query(rt2[y],rt2[L],z,29)));
		}
	}
	return 0;
}
2021/10/10 15:04
加载中...