https://www.lydsy.com/JudgeOnline/problem.php?id=4571

https://www.luogu.org/problemnew/show/P3293

一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1<=i<=n)。有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi 。因此,第 i 位顾客认为第 j 道菜的美味度为 bi XOR (aj+xi),XOR 表示异或运算。

第 i 位顾客希望从这些菜中挑出他认为最美味的菜,即美味值最大的菜,但由于价格等因素,他只能从第 li 道到第 ri 道中选择。请你帮助他们找出最美味的菜。

打眼一看,太好了!洛谷试炼场的可持久化trie终于是一道真的可持久化trie了!

等等,怎么还能加x的,emmm……

于是将自己的板子推倒重来,我们不用以前(我写的)板子造trie,而是使用值域来造可持久化trie树。

(但其实建法都差不多……开始怀疑以前的做法是否能够搬过来。)

这样就变成了对于b的每一位(当然是贪心地从高到低),我们查找符合条件的值域-x后是否存在这一位异或后为1即可。

(反正我理解的时候都是看的代码理解的,感觉说起原理来很绕,相信大家一定能看代码理解的233)

#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int mx=1e5-1;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
struct trie{int a[2],sz;
}tr[N*20];
int tot,rt[N],pool,n,m;
void insert(int y,int &x,int l,int r,int k){tr[x=++pool]=tr[y];tr[x].sz++;if(l==r)return;int mid=(l+r)>>1;if(k<=mid)insert(tr[y].a[0],tr[x].a[0],l,mid,k);else insert(tr[y].a[1],tr[x].a[1],mid+1,r,k);return;
}
int query(int nl,int nr,int l,int r,int L,int R){if(l==L&&r==R)return tr[nr].sz-tr[nl].sz;int mid=(l+r)>>1;if(R<=mid)return query(tr[nl].a[0],tr[nr].a[0],l,mid,L,R);else if(L>mid)return query(tr[nl].a[1],tr[nr].a[1],mid+1,r,L,R);else return query(tr[nl].a[0],tr[nr].a[0],l,mid,L,mid)+query(tr[nl].a[1],tr[nr].a[1],mid+1,r,mid+1,R);
}
int ask(int l,int r,int k,int x){int ans=0;for(int i=18;i>=0;i--){int L,R;bool p=k&(1<<i);if(p)L=ans,R=ans+(1<<i)-1;else L=ans+(1<<i),R=ans+(1<<i+1)-1;L=max(L-x,0),R=min(R-x,mx);if(L<=R&&query(rt[l-1],rt[r],0,mx,L,R))ans+=(1<<i)*(p^1);else ans+=(1<<i)*p;}return ans^k;
}
int main(){n=read(),m=read();for(int i=1;i<=n;i++){insert(rt[i-1],rt[i],0,mx,read());}for(int i=1;i<=m;i++){int k=read(),x=read(),l=read(),r=read();printf("%d\n",ask(l,r,k,x));}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8966237.html

BZOJ4571:[SCOI2016]美味——题解相关推荐

  1. 洛谷·[SCOI2016]美味

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

  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. [BZOJ 4571][Scoi2016]美味(主席树)

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

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

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

  6. luogu P3293 [SCOI2016]美味

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

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

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

  8. 一句话题解(20180210~)

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

  9. 【bzoj4571SCOI2016美味】

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

最新文章

  1. loadruner中加中Java_Script
  2. 网站性能分析(下)-让网站并行加载但顺序执行JS
  3. Lazy WriterCheckPoint
  4. android studio常用适配器,从ListView(Android Studio)的自定义适配器中的U...
  5. Unicode utf8等编码类型的原理
  6. 同步和异步GET,POST请求
  7. IBM服务器win7系统忘记密码,图文详解Win7系统忘记开机密码的处理方法
  8. vijos 1198 最佳课题选择
  9. Kylin启动异常:java.lang.outofMemoryError:Requested array size exceeds VM limit
  10. RedHat Linux 9.0 操作系统测试题2
  11. xshell连接及优化
  12. 基于Windows AD的单点登录系统
  13. 游戏修改服务器数据,修改游戏服务器数据的教程
  14. 毁灭程序员效率的 15 个障碍
  15. Java实现微信聊天记录生成器
  16. metasploit的SET的Credential Harvester Attack Method
  17. Python 技术篇 - whl库安装,有没有amd64结尾的区别
  18. Python Excel插入图片
  19. 台式机计算机上的无线开关,菜鸟教程:遥控电脑让PC实现无线开关机
  20. 三星用什么软件测试硬件,3个版本的三星S10软硬件大比拼,你最中意哪个

热门文章

  1. 免费获取验证码60秒倒计时
  2. 使用SeaJS实现模块化JavaScript开发
  3. 使用 DES 算法对数据加密
  4. CSS3的过渡和动画
  5. 无所不在的物联网设备 你我都需要正视所带来的安全问题
  6. 使用Maven创建Java项目
  7. 多核时代 .NET Framework 4 中的并行编程6---并行LINQ
  8. 互联网还留给我们这些出路
  9. Android 中文API (70) —— BluetoothDevice[蓝牙]
  10. SUN StorEdge 3320更改磁盘状态