正题

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


题目大意

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

1≤n,m≤2×105,0≤a,b,x<1051\leq n,m\leq 2\times10^5,0\leq a,b,x<10^51≤n,m≤2×105,0≤a,b,x<105


解题思路

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

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

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

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


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]美味 主席树 + 伪01trie

    传送门 文章目录 题意: 思路: 题意: 思路: 看到异或的话,很容易想到用01trie来贪心的搞,但是这个题涉及区间问题,直接搞的话需要将[l,r][l,r][l,r]的数都插入trie里面,这样的 ...

  2. P3293 [SCOI2016]美味

    P3293 [SCOI2016]美味 题意: 有n个数组a,现在有m个询问,每次给出一个b和x,问b xor (a[i] + x)的最大值是多少? 题解: 不难看出01Trie的题目 我们设ans=a ...

  3. trie树上值域化建主席树 查询异或平移最小值 ---- P3293 [SCOI2016]美味

    题目大意: 解题思路: 首先我们知道区间查询异或最小值肯定是在trie是匹配 而且如果没有(aj+xi)(aj+xi)(aj+xi)就是一个可持久化Trie树上面的裸题了 但是很不幸有 怎么办呢? 首 ...

  4. luogu P3293 [SCOI2016]美味

    传送门 异或最大值应该是要用\(trie\)树,从高位往低位贪心,虽然这里询问区间的数都要加上\(x\),但是仍然可以利用这个思想 从高往低位考虑,我们要找一个加上\(x\)后当前二进制位\(j\)不 ...

  5. 洛谷·[SCOI2016]美味

    初见安~这里是传送门:洛谷P3293 [SCOI2016]美味 题解 首先看到有两层限制:区间[l, r]以及要异或值最大.很显然把区间限制转化到时间限制,建可持久化数据结构. 每道菜对不同的人有不同 ...

  6. [BZOJ 4571][Scoi2016]美味(主席树)

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

  7. bzoj [Scoi2016]美味

    [Scoi2016]美味 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 721  Solved: 391 [Submit][Status][Disc ...

  8. P4602 [CTSC2018]混合果汁(主席树)

    P4602 [CTSC2018]混合果汁 共有nnn种果汁,第iii种果汁的美味度为did_idi​,每升价格为pip_ipi​,在一瓶混合果汁中,最多只能添加lil_ili​升. 有mmm个询问,每 ...

  9. BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案

    题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...

最新文章

  1. 组策略 从入门到精通 (七) 组策略的继承
  2. php和python写爬虫-为什么选择用python做爬虫
  3. tomcat 和apache的整合的方法及配置(一)
  4. 复现经典:《统计学习方法》第 2 章 感知机
  5. Python中JSON的基本使用
  6. php常量数组吗,包含数组的PHP常量?
  7. Linux shell编程学习笔记-----第十六章
  8. CF917D-Stranger Trees【矩阵树定理,高斯消元】
  9. 选择版本Win7系统VS2010下搭建qt开发环境
  10. 卸载SD卡对MediaServer的处理
  11. java中时时检查代码中变量的值_如何调试JDK源代码并查看局部变量值
  12. Word批量转PDF,宏批量转PDF
  13. 【Fortran】STOP语句
  14. python可以剪辑视频吗_你知道吗?Python也可以剪辑视频!
  15. yaml文件 *.yml 写法简介
  16. python - BeautifulSoup教程
  17. CSS transform属性
  18. 戴尔科技集团的“新常态”
  19. 百度竞价推广是什么?信息流推广以及网盟推广是什么?
  20. 米家扫拖一体机器人重置键_米家扫拖一体机器人的使用感受和小建议

热门文章

  1. 通达学院计算机组成原理试卷及答案,2021全国网络工程专业大学排名(5篇)
  2. mysql分析日志_MYSQL 索引(三)--- SQL日志分析
  3. 移动计算机怎么开机密码,win7忘记开机密码解决办法
  4. java jdbc 删除_java使用jdbc实现各种类型添加删除修改数据
  5. 统计学习导论_统计机器学习之扫盲导论篇
  6. maya的颤动怎么做_必看!新手学习MAYA的几个建议
  7. leetcode669. 修剪二叉搜索树
  8. leetcode15. 三数之和(三指针)
  9. C++实现数组模拟链表(实现链表的增删功能)
  10. [JavaWeb-HTML]HTML标签_列表标签