4571: [Scoi2016]美味

主席树·位运算 的 奇妙世界

题解:

i∈[L,R]i∈[L,R],最大化:Xxor(A[i]+Y)X xor (A[i]+Y)

  • 如果我们先不考虑i∈[L,R]i∈[L,R]和+Y+Y呢?

    一个按位的二叉tire树可以解决问题。

    每次根据XX的当前位决定优先向左还是向右,如果优先的一边没有点则走另一边。

    如果实际走的是优先选的那一边,ans=(ans<<1)+1,否则ans=ans<<1

  • 加上i∈[L,R]i∈[L,R]的限制?

    换上可持久化tire树即可。

  • 考虑+Y+Y?

    可持久化tire树就不行了。。。

    引用自:http://blog.csdn.net/neither_nor/article/details/51378123,有些许修改。

    考虑可持久化trie其实可以等价为一颗上限为2k−12^k-1的主席树,在trie上确定一位其实相当于将答案的区间缩小的一半,也就是在主席树上向下走一层

    当所有数加上YY之后,我们在主席树上走的时候看优先走的那一边有木有点就不能直接调用sz[son[x][0/1]],但是因为所有数都被加了,所以我们其实要查询的是优先走的区间向前窜YY位之后的区间有没有数,这样的话每次走的时候在主席树上重新查[l-Y,mid-Y]或者[mid+1-Y,r-Y]来判断应该往哪边走即可,复杂度多了个log,但是n=2*10^5,不虚。

讲真,我调了2h+

Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define D(x) cout<<#x<<" = "<<x<<"  "
#define E cout<<endl
using namespace std;
const int LOG = 18;
const int N = 1<<LOG;int n,m,X,Y,L,R,ans,a[N],mx;
int lch[N*20],rch[N*20],cnt[N*20],sz,root[N];void clone(int x,int t){lch[x]=lch[t]; rch[x]=rch[t]; cnt[x]=cnt[t];
}void insert(int &x,int t,int l,int r,int p){x=++sz; clone(x,t); cnt[x]++;if(l!=r){int mid=(l+r)>>1;if(p<=mid) insert(lch[x],lch[t],l,mid,p);else insert(rch[x],rch[t],mid+1,r,p);}
}int query(int a,int b,int l,int r,int ql,int qr){if(ql<=l && r<=qr){ return cnt[b]-cnt[a]; }else{int mid=(l+r)>>1, ans=0;if(ql<=mid) ans+=query(lch[a],lch[b],l,mid,ql,qr);if(qr>mid) ans+=query(rch[a],rch[b],mid+1,r,ql,qr);return ans;}
}void solve(int l,int r,int bit){
//  D(l); D(r); D(bit); D(ans); E;if(l!=r){int mid=(l+r)>>1;if(X&(1<<bit)){
//          D(max(l-Y,0)); D(max(mid-Y,0)); D(query(root[L-1],root[R],0,mx,max(l-Y,0),max(mid-Y,0))); E;if(query(root[L-1],root[R],0,mx,max(l-Y,0),max(mid-Y,0))){ ans=(ans<<1)+1; solve(l,mid,bit-1); }else{ ans=ans<<1; solve(mid+1,r,bit-1); }}else{
//          D(max(mid+1-Y,0)); D(max(r-Y,0)); D(query(root[L-1],root[R],0,mx,max(mid+1-Y,0),max(r-Y,0))); E;if(query(root[L-1],root[R],0,mx,max(mid+1-Y,0),max(r-Y,0))){ ans=(ans<<1)+1; solve(mid+1,r,bit-1); }else{ ans=ans<<1; solve(l,mid,bit-1); }}}
}int main(){freopen("a.in","r",stdin);scanf("%d%d",&n,&m);mx=(1<<LOG)-1; //D(mx); E;for(int i=1;i<=n;i++){ scanf("%d",a+i); }for(int i=1;i<=n;i++){ insert(root[i],root[i-1],0,mx,a[i]); }for(int i=1;i<=m;i++){scanf("%d%d%d%d",&X,&Y,&L,&R);
//      D(X); D(Y); E;ans=0; solve(0,mx,LOG-1); printf("%d\n",ans);}
}

4571: [Scoi2016]美味相关推荐

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

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

  2. bzoj [Scoi2016]美味

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

  3. P3293 [SCOI2016]美味

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

  4. 洛谷·[SCOI2016]美味

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

  5. BZOJ4571:[SCOI2016]美味——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4571 https://www.luogu.org/problemnew/show/P3293 一家 ...

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

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

  7. luogu P3293 [SCOI2016]美味

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

  8. P3293 [SCOI2016]美味 主席树 + 伪01trie

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

  9. 【bzoj4571SCOI2016美味】

    4571: [Scoi2016]美味 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 656  Solved: 350 [Submit][Status ...

  10. 一句话题解(20180210~)

    2.9 BZOJ 2006 [NOI2010]超级钢琴.这道题目几天之前就做了.做法是固定右端点,左端点在ST表上走,走法其实就是笛卡尔树的走法.完结撒花! BZOJ 1218 [HNOI2003]激 ...

最新文章

  1. Linux下搭建SVN+版本冲突
  2. 直流电源端口雷击或瞬态浪涌防护设计方案图详解
  3. 蓝桥杯 ADV-148算法提高 排队打水问题(贪心)
  4. 95后频频离职,是员工本人问题?
  5. 应用程序框架实战四:你需要应用程序框架吗
  6. Oracle启动报错ORA-03113解决
  7. 产品经理面试——简历填写
  8. 赚了20亿美元GandCrab勒索病毒家族的故事
  9. Snipaste安装教程及软件(截图工具)
  10. 【项目管理/PMP/PMBOK第六版/新考纲】计算题! 项目章程/变更/工作绩效报告/项目范围说明书/工作分解结构WBS/最小浮动时间/挣值分析/采购
  11. SLAM十四讲ch5 joinMap错误解决
  12. 苹果上网本报价_1小时一个价 iPhone12加价300元起
  13. mysql 利用游标循环删除数据报错:No data - zero rows fetched, selected, or processed
  14. 华为荣耀启动“二级火箭”战略,加速向线下突进
  15. 隐私泄露防不胜防,真的没有办法了吗?
  16. 2017.7.27 计算机编程培训第二天
  17. 专家解读:读研到底值不值(转自中华英才网)
  18. 开发者测评:相比 Harbor,我选择 ACR 的三点原因
  19. echarts地图钓鱼岛赤尾屿和南海诸岛内部岛屿问题
  20. hp 388g9服务器硬盘更换,HP DL380 G9 6块硬盘,做了RAID0+1.现在坏了一块硬盘,需要更换,需要怎么操作?...

热门文章

  1. oralce 12c集群 ora-01033
  2. 推导抛物线插值的拉格朗日插值公式
  3. 智慧管廊可视化管理系统搭建
  4. 2020-09-08风扇并联与串联应用学习
  5. Unity移动---朝向并移动到鼠标点击位置
  6. 读取UYVY格式的YUV图片,并转为RGB格式
  7. XJOI一级一段题解(g++,即C++),也可视作C++算法竞赛教程
  8. 致远项目管理SPM系统五大技术平台层-CMP能力概述
  9. 数据结构之线性表的链式存储结构(C语言)
  10. ad10搜索快捷键_AD 常用快捷键