正题

题目链接: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. MyBatis的useGeneratedKeys使用

    业务需求,用户表为主键自增,添加完用户之后,通过用户ID和角色表进行关联. 问题:由于主键自增,所以在用户添加之前是不知道ID的,当然可以通过查询得到当前的ID,不过需要自己多一步操作. 解决方案:使 ...

  2. 配置之XML--读取XML文件 转存为Key-Value

    将XML文件读取 绑定数据至Dictionary Eg: Xml文件 <?xml version="1.0" encoding="utf-8" ?> ...

  3. spring生命周期的应用

    1.ApplicationContextAware 实现手工加载bean: 例:https://www.cnblogs.com/wala-wo/p/5119192.html https://www.c ...

  4. 优先队列PriorityQueue&Lambda&Comparator

    今天翻阅<Labuladuo的算法小抄>时发现在使用优先队列的PriorityQueue解决一道hard题时(leetCode 23),出现了如下代码: ListNode mergeKLi ...

  5. win修改host问及那

  6. jquery mobile cdn

    <head> <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jque ...

  7. 五分钟搞懂MySQL索引下推

    大家好,我是老三,今天分享一个小知识点--索引下推. 如果你在面试中,听到MySQL5.6"."索引优化" 之类的词语,你就要立马get到,这个问的是"索引下推 ...

  8. Python 高级特性(1)- 切片

    前言 面 tx 被问到 python 的高级特性相关,这里做个补充学习吧 正向范围取值 关键点 首位下标是 0 第一个数字是起始下标,第二个数字是结束下标(但最终结果不包含它) 代码块一 # 正向范围 ...

  9. openswan协商流程之(五):main_inR2_outI3()

    主模式第五包:main_inR2_outI3 文章目录 主模式第五包:main_inR2_outI3 1. 序言 2.函数调用关系 3. 第五个报文流程图 4. main_inR2_outI3()源码 ...

  10. LayoutControl控件使用

    因默认外边距过大需要将外边距缩小用以下代码实现layoutControlGroup1.Padding = DevExpress.XtraLayout.Utils.Padding.Empty;是否允许只 ...