对于每个询问暴力枚举x~y,然后在Trie去找第k大,开始我写了个二分答案然后算比当前答案大的个数,打了个第10个点的表就跑出19s+比bzoj垫底还慢4s+

然而不用二分,直接1000个点一起在树上跑就可以了。。。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int _=1e2;
const int maxn=1e3+_;
const int maxm=*1e5+_;
int read()
{
int x=,f=; char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
void write(int x)
{
if(x>=)write(x/);
putchar(x%+'');
}
struct Trie
{
int w[],c;
}tr[maxm*];int trlen,rt[maxm];
int insert(int d)
{
int now=++trlen,ret=now;
tr[now].c++;
for(int i=;i>=;i--)
{
int x=(d&(<<i))?:;
tr[now].w[x]=++trlen;
now=tr[now].w[x];
tr[now].c++;
}
return ret;
}
int merge(int x,int y)
{
if(x==||y==)return x+y;
tr[x].c+=tr[y].c;
tr[x].w[]=merge(tr[x].w[],tr[y].w[]);
tr[x].w[]=merge(tr[x].w[],tr[y].w[]);
return x;
} //----------------------------------------pre--------------------------------------- int calc(int k,int x,int y,int c,int d)
{
if(k==-)return tr[y].c-tr[x].c;
int p=(d&(<<k))?:,q=(c&(<<k))?:;//d的当前位,现在如果这一位要变成1,字典树上往哪走
if(p==)
return tr[tr[y].w[q]].c-tr[tr[x].w[q]].c+calc(k-,tr[x].w[q^],tr[y].w[q^],c,d);//如果当前位是0只要异或成1就一定更大了
else
return calc(k-,tr[x].w[q],tr[y].w[q],c,d);
}
int c[maxn],x,y,u,v;
int check(int d)
{
int ret=;
for(int i=x;i<=y;i++)
{
ret+=calc(,rt[u-],rt[v],c[i],d);
}
return ret;
}
int main()
{
int n,m,d;
n=read(),m=read();
for(int i=;i<=n;i++)c[i]=read();
if(c[]==)
{puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
puts("");
return ;
}
for(int i=;i<=m;i++)
{
d=read();
rt[i]=insert(d);
rt[i]=merge(rt[i],rt[i-]);
} int Q,k;LL l,r,mid,ans;
Q=read();
while(Q--)
{
x=read(),y=read(),u=read(),v=read(),k=read();
l=,r=;
while(l<=r)
{
mid=(l+r)/;
if(check(mid)>=k)//比mid大的数多于k个
ans=mid,l=mid+;
else
r=mid-;
}
write(ans),puts("");
}
return ;
}

道德的沦丧

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int _=1e2;
const int maxn=1e3+_;
const int maxm=*1e5+_;
int read()
{
int x=,f=; char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
void write(int x)
{
if(x>=)write(x/);
putchar(x%+'');
} struct Trie
{
int w[],c;
}tr[maxm*];int trlen,rt[maxm];
int insert(int d)
{
int now=++trlen,ret=now;
tr[now].c++;
for(int i=;i>=;i--)
{
int x=(d&(<<i))?:;
tr[now].w[x]=++trlen;
now=tr[now].w[x];
tr[now].c++;
}
return ret;
}
int merge(int x,int y)
{
if(x==||y==)return x+y;
tr[x].c+=tr[y].c;
tr[x].w[]=merge(tr[x].w[],tr[y].w[]);
tr[x].w[]=merge(tr[x].w[],tr[y].w[]);
return x;
} int c[maxn],nx[maxn],ny[maxn],g[maxn];
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int n,m,d;
n=read(),m=read();
for(int i=;i<=n;i++)c[i]=read();
for(int i=;i<=m;i++)
{
d=read();
rt[i]=insert(d);
rt[i]=merge(rt[i],rt[i-]);
} int Q,k,x,y,u,v;
Q=read();
while(Q--)
{
x=read(),y=read(),u=read(),v=read(),k=read();
int ans=;
for(int i=x;i<=y;i++)nx[i]=rt[u-],ny[i]=rt[v];
for(int i=;i>=;i--)
{
int num=;
for(int p=x;p<=y;p++)//看看如果这一位变成1的方案数是否已经超过k了
{
g[p]=(c[p]&(<<i))?:;//走那边变成1
num+=tr[tr[ny[p]].w[g[p]]].c-tr[tr[nx[p]].w[g[p]]].c;
}
if(num>=k)//超过了,动用1就行了
{
ans|=(<<i);
for(int p=x;p<=y;p++)
nx[p]=tr[nx[p]].w[g[p]],ny[p]=tr[ny[p]].w[g[p]];
}
else //不够,要用0补
{
k-=num;
for(int p=x;p<=y;p++)
nx[p]=tr[nx[p]].w[g[p]^],ny[p]=tr[ny[p]].w[g[p]^];
}
}
write(ans),puts("");
}
return ;
}

bzoj4103: [Thu Summer Camp 2015]异或运算的更多相关文章

  1. [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...

  2. BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】

    题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...

  3. bzoj4103 [Thu Summer Camp 2015]异或运算(可持久化trie)

    内存限制:512 MiB 时间限制:1000 ms 题目描述 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi ...

  4. 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 474  Solved: 258 De ...

  5. 【bzoj4103】[Thu Summer Camp 2015]异或运算 可持久化trie树

    Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i ...

  6. [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】

    题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...

  7. 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie

    我们观察数据:树套树 PASS    主席树 PASS  一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q* ...

  8. BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie

    开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...

  9. 【BZOJ 4104】【Thu Summer Camp 2015】解密运算

    http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include& ...

随机推荐

  1. Java 面试参考指南 — 同步

    同步 在多线程程序中,同步修饰符用来控制对临界区代码的访问.其中一种方式是用synchronized关键字来保证代码的线程安全性.在Java中,synchronized修饰的代码块或方法不会被多个线程 ...

  2. jenkins换端口号

    两个地方 1,检查 /etc/init.d/jenkins 脚本,修改 do_start 函数的 check_tcp_port 命令,端口号从 8080 换成 8082: 2,修改 /etc/defa ...

  3. docker命令解析

    1.docker run --name lllllll  -d -p 8080:8080 -p 9000:9000  镜像id          将docker8080端口映射到服务器的8080端口 ...

  4. Java 学习(3):java 对象和类

    目录: --- 对象 --- 类 --- 源文件的声明规则 --- Java 包 对象: 对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种: ...

  5. linux与windows查看占用端口的进程ID并杀死进程

    有时候tomcat出现端口被占用,需要查出进程ID并杀死进程. 1.查找占用端口的进程ID(windows与linux一样  8005也可以加上引号   grep可以用findstr替换) 6904就 ...

  6. bootstrap theme & template

    https://wrapbootstrap.com/ Unify http://wrapbootstrap.com/preview/WB0412697 https://htmlstream.com/p ...

  7. usaco feb04距离咨询

    [USACO FEB04]距离咨询 成绩   开启时间 2014年09月19日 星期五 10:08 折扣 0.8 折扣时间 2014年09月26日 星期五 10:08 允许迟交 是 关闭时间 2014 ...

  8. ffmpeg实时编码解码部分代码

    程序分为编码端和解码端,两端通过tcp  socket通信,编码端一边编码一边将编码后的数据发送给解码端.解码端一边接收数据一边将解码得到的帧显示出来. 代码中的编码端编码的是实时屏幕截图. 代码调用 ...

  9. github 新建远程仓库 及 删除远程仓库

    一.新建远程仓库 1.点击 ' + ' 号 2.选择 ' new repository ' 3.填写信息  创建仓库 二.删除远程仓库 1.点击 ' Settings ' 按钮 2.滑动到最底部,点击 ...

  10. MySql 查询一周内记录

    本周内:select * from wap_content where week(created_at) = week(now) 查询一天:select * from table where to_d ...