传送门

文章目录

  • 题意:
  • 思路:

题意:

思路:

看到异或的话,很容易想到用01trie来贪心的搞,但是这个题涉及区间问题,直接搞的话需要将[l,r][l,r][l,r]的数都插入trie里面,这样的复杂度显然是不能接受的,但是我们可以借助01trie的思路来解决这个题。
01trie原理就是从高位到低位开始,每一位都走与bbb当前位相反的数,当前为111就走000,为000就走111,这是在trie树上的时候可以这样贪心,我们可以将其转换成值域上,定义ansansans初始值为000,让后从高到低看bbb的每一位,每次都看是否能找到与当前位相反的数存在,当然这是一个范围,比如当前bbb为111,那么就查询[ans−x,ans−x+(1<<i)−1][ans-x,ans-x+(1<<i)-1][ans−x,ans−x+(1<<i)−1],否则就查询[ans−x+(1<<i),ans−x+(1<<(i+1))−1][ans-x+(1<<i),ans-x+(1<<(i+1))-1][ans−x+(1<<i),ans−x+(1<<(i+1))−1],减xxx是因为原题加了xxx。
比如bbb为010101010101,当前位为000,那么我们应该让这一位尽可能为111,所以我们就查询[1000,1111][1000,1111][1000,1111]是否存在,如果存在的话就让ans+=(1<<i)ans+=(1<<i)ans+=(1<<i),让后下一位是111,那么我们就查询[ans+000,ans+011][ans+000,ans+011][ans+000,ans+011],让后这样继续查下去就行啦,当然要减去xxx,最后别忘记ansbans^bansb就行啦。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=200010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int a[N*2],root[N*2],tot;
struct Node
{int l,r;int cnt;
}tr[N*40];void insert(int p,int &q,int l,int r,int pos,int x)
{q=++tot; tr[q]=tr[p];tr[q].cnt+=x;if(l==r) return;int mid=l+r>>1;if(pos<=mid) insert(tr[p].l,tr[q].l,l,mid,pos,x);else insert(tr[p].r,tr[q].r,mid+1,r,pos,x);
}int query(int p,int q,int l,int r,int ql,int qr)
{int num=tr[q].cnt-tr[p].cnt;if(!num) return 0;if(l>=ql&&r<=qr) return num;int mid=l+r>>1,ans=0;if(ql<=mid) ans+=query(tr[p].l,tr[q].l,l,mid,ql,qr);if(qr>mid) ans+=query(tr[p].r,tr[q].r,mid+1,r,ql,qr);return ans;
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]),insert(root[i-1],root[i],0,100000,a[i],1);while(m--){int b,x,l,r; scanf("%d%d%d%d",&b,&x,&l,&r);int ans=0;for(int i=17;i>=0;i--){if(b>>i&1) { if(query(root[l-1],root[r],0,100000,ans-x,ans-x+(1<<i)-1)==0) ans+=(1<<i); }else { if(query(root[l-1],root[r],0,100000,ans-x+(1<<i),ans-x+(1<<(i+1))-1)>0) ans+=(1<<i); }}printf("%d\n",ans^b);}return 0;
}
/**/

P3293 [SCOI2016]美味 主席树 + 伪01trie相关推荐

  1. P3293 [SCOI2016]美味

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

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

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

  3. luogu P3293 [SCOI2016]美味

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

  4. 洛谷·[SCOI2016]美味

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

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

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

  6. P3293-[SCOI2016]美味【主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3293 题目大意 给出一个长度为nnn的序列,mmm次询问给出b,x,l,rb,x,l,rb,x,l,r表示询问在 ...

  7. 【洛谷P3701】 「伪模板」主席树【网络流】

    题目大意: 题目链接:https://www.luogu.org/problemnew/show/P3701 byx和手气君都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家 ...

  8. bzoj [Scoi2016]美味

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

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

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

最新文章

  1. 【力扣网练习题】移除元素
  2. jsp java 分离,java与jsp页面的字符串拼接和拆分
  3. C# 小闹钟 v3.0
  4. Vue面试题汇总目录
  5. Python functool module
  6. 反流氓软件运动为何变了味
  7. python 文件的打开与读取
  8. Android P init进程reboot流程和调试方法
  9. java 实现魔兽搜索器 魔兽对战平台
  10. linux系统上安装python工具的步骤
  11. Qualcomm 音频学习一
  12. Oracle读取数据库中表填充,Oracle数据库中查看所有表和字段以及表注释.字段注释...
  13. DSP CCS12.00 芯片:TMS320F28335 PWM 的设计
  14. FAST 2020 摘要概览
  15. 正则表达式中/g /i /m /e /x /s的用法
  16. 大物实验报告之霍尔元件测磁场
  17. 电力网络通信公司有哪些,电力网络通信公司排名
  18. 中科院文思海辉IBM共建大数据研究生人才培养体系 瞄准中高端人才
  19. CSDN学霸课表——从应用解析到基础实战,大数据入门、晋级课程推荐
  20. C++多线程helloWord

热门文章

  1. 除了中国,原来还有这么多国家采用十二生肖的啊~| 今日最佳
  2. 限时秒杀┃月销10000+件,风靡全国的steam科学实验套装
  3. 三维重建 几何方法 深度学习_基于深度学习的视觉三维重建研究总结
  4. mysql 常用权限_MySQL的权限有哪些
  5. python实战excel_实战python 读写EXCEL表
  6. postgresql 动态添加过滤条件_通过窗口函数进行过滤导致Postgresql
  7. java什么是静态_什么是java静态
  8. hotelling t2 matlab,pca主成份分析方法
  9. linux远程登录命令rlogin,Linux rlogin命令
  10. listview在java中的使用_我的Android开发之路——ListView的使用