大家好,又见面了,我是你们的朋友全栈君。
51nod 1295
可持久化trie,其实和可持久化线段树差不多
之前写过一次,现在加深了一点点对于可持久化的理解
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define mem(i,a) memset(i,a,sizeof(i))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define ll long long
#define LL long long
using namespace std;
const int maxn = 5e4+7;
int tr[maxn*40][2],sum[maxn*40],root[maxn];
int n,m,cnt=0,x;
void update(int len,int x,int &u,int v) {
u = ++cnt;
for(int i = 0;i<2;i++) tr[u][i] = tr[v][i];
sum[u] = sum[v]+1;
if(len==0) return;
update(len-1,x,tr[u][(x>>len-1)&1],tr[v][(x>>len-1)&1]);
}
int query(int len,int u,int v) {
int now = 1-((x>>(len-1))&1);
if(len==0) return 0;
if(sum[tr[u][now]] > sum[tr[v][now]])
return query(len-1,tr[u][now],tr[v][now])+(1<<(len-1));
return query(len-1,tr[u][1-now],tr[v][1-now]);
}
int main() {
scanf("%d%d",&n,&m);
for(int i = 1;i<=n;i++) {
scanf("%d",&x);
update(30,x,root[i],root[i-1]);
}
int l,r;
for(int i = 1;i<=m;i++) {
scanf("%d%d%d",&x,&l,&r);
printf("%d\n",query(30,root[r+1],root[l]));
}
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160207.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...