正题

题目链接:https://www.luogu.com.cn/problem/P3293


题目大意

给出一个长度为\(n\)的序列,\(m\)次询问给出\(b,x,l,r\)表示询问在\([l,r]\)中找到一个数字\(a\)使得\(b\ xor\ (a+x)\)的值最大。

\(1\leq n,m\leq 2\times10^5,0\leq a,b,x<10^5\)


解题思路

往\(Trie\)上想就很容易卡思路,考虑正常情况下我们是怎么求\(b\ xor\ a\)最大的。

其实在\(Trie\)树上条等价于每次询问一个区间内有没有值然后再选择往左或者往右,现在这个\(x\)就是相当于把我们询问的区间移动了,既然\(Trie\)树解决不了这样的问题那么就考虑一下主席树。

定义一下\(z\)表示异或的那个数的基数(前面枚举的位已经确定),从大到小枚举\(i\),若\(b\)的第\(i\)位有那么最好是让\(a+x\)的第\(i\)位没有,也就是询问\([z-x,z-x+2^i)\)。如果第\(i\)位没有那么最好是\(a+x\)的第\(i\)位有,那么询问\([z-x+2^i,z-x+2^{i+1})\)就好了。

时间复杂度\(O(n\log^2 n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10,M=N<<5,Li=1e5;
int n,m,cnt,rt[N],w[M],ls[M],rs[M];
int Change(int x,int L,int R,int pos){
int now=++cnt;w[now]=w[x]+1;
if(L==R)return now;
int mid=(L+R)>>1;
if(pos<=mid)ls[now]=Change(ls[x],L,mid,pos),rs[now]=rs[x];
else rs[now]=Change(rs[x],mid+1,R,pos),ls[now]=ls[x];
return now;
}
int Ask(int x,int y,int L,int R,int l,int r){
if(!(w[y]-w[x]))return 0;
if(L==l&&R==r)return w[y]-w[x];
int mid=(L+R)>>1;
if(r<=mid)return Ask(ls[x],ls[y],L,mid,l,r);
if(l>mid)return Ask(rs[x],rs[y],mid+1,R,l,r);
return Ask(ls[x],ls[y],L,mid,l,mid)+Ask(rs[x],rs[y],mid+1,R,mid+1,r);
}
int Query(int L,int R,int l,int r){
if(l<0)l=0;if(r>Li)r=Li;if(r<l)return 0;
return Ask(rt[L-1],rt[R],0,Li,l,r);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
rt[i]=Change(rt[i-1],0,Li,x);
}
while(m--){
int b,a,l,r,z=0,ans=0;
scanf("%d%d%d%d",&b,&a,&l,&r);
for(int i=17;i>=0;i--){
if((b>>i)&1){
if(Query(l,r,z-a,z-a+(1<<i)-1))
ans|=(1<<i);
else z|=(1<<i);
}
else{
if(Query(l,r,z-a+(1<<i),z-a+(1<<i+1)-1))
ans|=(1<<i),z|=(1<<i);
}
}
printf("%d\n",ans);
}
return 0;
}

P3293-[SCOI2016]美味【主席树】的更多相关文章

  1. P3293 [SCOI2016]美味 主席树+按位贪心

    给定长度为 \(n\) 序列 \(a[i]\) ,每次询问区间 \([l,r]\) ,并给定 \(b,x\) 中的一个数 \(p=a[i]\) ,使得最大化 \(b \bigoplus p^x\) 主 ...

  2. 【BZOJ4571】[Scoi2016]美味 主席树

    [BZOJ4571][Scoi2016]美味 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值 ...

  3. bzoj 4571: [Scoi2016]美味 (主席树)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 题面; 4571: [Scoi2016]美味 Time Limit: 30 Sec   ...

  4. BZOJ.4571.[SCOI2016]美味(主席树 贪心)

    题目链接 要求 \(b\ xor\ (a_j+x)\) 最大,应让 \(a_j+x\) 的最高位尽可能与b相反.带个减法Trie树好像很难做?反正我不会. 从最高位开始,如果这位b是0/1,判断是否存 ...

  5. [SCOI2016]美味——主席树+按位贪心

    原题戳这里 题解 让异或值最大显然要按位贪心,然后我们还发现加上一个\(x_i\)的效果就是所有\(a_i\)整体向右偏移了,我们对于\({a_i}\)开个主席树,支持查询一个区间中有多少个在\([L ...

  6. BZOJ4517[Scoi2016]美味——主席树

    题目描述 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 i 位顾客认为 ...

  7. BZOJ4571:[SCOI2016]美味(主席树,贪心)

    Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi . 因此,第 ...

  8. bzoj 4571 [Scoi2016]美味——主席树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 按位考虑,需要的就是一个区间:比如最高位就是(2^k -x). 对于不是最高位的位置该 ...

  9. 洛谷P3293 [SCOI2016]美味(主席树)

    传送门 据说这题做法叫做可持久化trie树?(然而我并不会) 首先考虑一下贪心,从高位到低位枚举,如果能选1肯定比选0优 假设已经处理到了$b$的第$i$位,为1(为0的话同理就不说了) 那么只有当$ ...

  10. luogu P3293 [SCOI2016]美味

    题目描述 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1<=i<=n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi .因此,第 ...

随机推荐

  1. vue 报错http://eslint.org/docs/rules/xxxxx

    vue 对语法的要求过于严格所以编译的时候报下面这个错误 解决办法: bulid文件夹 -> webpack.base.conf.js 找到下面的代码: module: { rules: [ / ...

  2. kafka查看Topic列表及消费状态等常用命令

    环境 本文中的操作均基于kafka_1.3.3.0,且所有命令经过实际验证. 常用工具 新建Topic ./kafka-topics --zookeeper 166.188.xx.xx --creat ...

  3. visual studio如何检查内存泄露?

    Visual Studio有专门的插件叫做Visual Leak Detector (VLD)Visual Leak Detector for Visual C++ 2008/2010/2012/20 ...

  4. WPF 获取主线程

    WPF线程获取UI线程   WPF中只能是UI线程才可以改变UI控件相关,当采用多线程工作时,可用以下代码获取 UI线程进行操作: App.Current.Dispatcher.Invoke((Act ...

  5. CentOS8安装jdk1.8

    安装方法 CentOS8上使用 yum 直接安装,环境变量自动配置好 查看是否已安装 看到下面结果,说明已经安装配置 jdk [root@iZ2ze8crquorxf6c7l0eluZ ~]# jav ...

  6. Ztree 树插件 树节点名称太长的解决方案

    样式允许的情况下 给背景div加滚动条.. 或者使用省略号方法:使用addDiyDom   http://blog.csdn.net/zhengbo0/article/details/17759543 ...

  7. String与Int类型的转换

    http://blog.sina.com.cn/s/blog_4f9d6b1001000bfo.html int -> String int i=12345; String s="&q ...

  8. 一招解决下载或下拉GitHub项目速度太慢的问题

    相信很多朋友都有过这样的体验,就是从Github上下载或clone别人的项目时特别慢,甚至还会出现链接意外终止的情况,那么今天就来给大家分享一个提速的方法,步骤也非常简单,亲测有效! 首先进入你的目标 ...

  9. HCNP Routing&Switching之OSPF虚连接

    前文我们了解了OSPF的网络类型.帧中继交换机映射以及路由器帧中继映射相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15195762.html:今天我 ...

  10. go实现堆排序

    package main import "fmt" func main(){ arr:=[]int{4,8,2,1,6,9,3,5,7,8,1,4} dui(arr) fmt.Pr ...