您的位置:首页 > 其它

bzoj4546 codechef XRQRS

2016-04-23 15:28 399 查看
  可持久化trie

  代码

#include<cstdio>
#define N 10000010
#define M 600100
int tt,m,n;
int i,tot,typ,a,b,c,last,num;
int trie[M],v[30];
int cnt,f
[3];
void add(int &x,int y,int z)
{
x=++cnt;
int tmp=x,i;
for (i=1;i<=19;i++)v[i]=z%2,z/=2;
for (i=19;i>=1;i--)
{
f[tmp][0]=f[y][0];
f[tmp][1]=f[y][1];
f[tmp][2]=f[y][2]+1;
f[tmp][v[i]]=++cnt;
tmp=f[tmp][v[i]];y=f[y][v[i]];
}
f[tmp][2]=f[y][2]+1;
}
int query1(int x,int y,int z)
{
int ans=0,i;
for (i=1;i<=19;i++)v[i]=z%2,z/=2;
for (i=19;i>=1;i--)
{
if (v[i])
{
ans+=(f[f[y][0]][2]-f[f[x][0]][2]);
x=f[x][1];
y=f[y][1];
}
else
{
x=f[x][0];
y=f[y][0];
}
}
ans+=(f[y][2]-f[x][2]);
return ans;
}
int query2(int x,int y,int z)
{
int i,ans=0;
for (i=19;i>=1;i--)
{
if (f[f[y][0]][2]-f[f[x][0]][2]>=z)
{
//printf("0 %d\n",f[y][2]);
x=f[x][0];
y=f[y][0];
}
else
{
//    printf("1 %d\n",f[y][2]);
ans+=(1<<(i-1));
z=z-(f[f[y][0]][2]-f[f[x][0]][2]);
x=f[x][1];
y=f[y][1];
}
}
return ans;
}
int query3(int x,int y,int z)
{
int i,ans=0;
for (i=1;i<=19;i++)
v[i]=z%2,z/=2;
for (i=19;i>=1;i--)
{
if (f[f[y][1-v[i]]][2]-f[f[x][1-v[i]]][2])
{
ans+=(1-v[i])*(1<<(i-1));
y=f[y][1-v[i]];
x=f[x][1-v[i]];
}
else
{
ans+=v[i]*(1<<(i-1));
y=f[y][v[i]];
x=f[x][v[i]];
}
}
return ans;
}
int main()
{
scanf("%d",&n);
tot=0;trie[0]=++cnt;
for (i=1;i<=n;i++)
{
scanf("%d",&typ);
if (typ==1)
{
scanf("%d",&a);
tot++;add(trie[tot],trie[tot-1],a);
}
else
if (typ==2)
{
scanf("%d%d%d",&a,&b,&c);
printf("%d\n",query3(trie[a-1],trie[b],c));
}
else
if (typ==3)
{
scanf("%d",&a);
tot-=a;cnt=trie[tot+1]-1;
}
else
if (typ==4)
{
scanf("%d%d%d",&a,&b,&c);
printf("%d\n",query1(trie[a-1],trie[b],c));
}
else
if (typ==5)
{
scanf("%d%d%d",&a,&b,&c);
printf("%d\n",query2(trie[a-1],trie[b],c));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: