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+;
const int mx=1e5-;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct trie{
int a[],sz;
}tr[N*];
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)>>;
if(k<=mid)insert(tr[y].a[],tr[x].a[],l,mid,k);
else insert(tr[y].a[],tr[x].a[],mid+,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)>>;
if(R<=mid)return query(tr[nl].a[],tr[nr].a[],l,mid,L,R);
else if(L>mid)return query(tr[nl].a[],tr[nr].a[],mid+,r,L,R);
else return query(tr[nl].a[],tr[nr].a[],l,mid,L,mid)+
query(tr[nl].a[],tr[nr].a[],mid+,r,mid+,R);
}
int ask(int l,int r,int k,int x){
int ans=;
for(int i=;i>=;i--){
int L,R;
bool p=k&(<<i);
if(p)L=ans,R=ans+(<<i)-;
else L=ans+(<<i),R=ans+(<<i+)-;
L=max(L-x,),R=min(R-x,mx);
if(L<=R&&query(rt[l-],rt[r],,mx,L,R))ans+=(<<i)*(p^);
else ans+=(<<i)*p;
}
return ans^k;
}
int main(){
n=read(),m=read();
for(int i=;i<=n;i++){
insert(rt[i-],rt[i],,mx,read());
}
for(int i=;i<=m;i++){
int k=read(),x=read(),l=read(),r=read();
printf("%d\n",ask(l,r,k,x));
}
return ;
}

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

+本文作者:luyouqi233。               +

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

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

BZOJ4571:[SCOI2016]美味——题解的更多相关文章

  1. bzoj4571: [Scoi2016]美味

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

  2. 【bzoj4571&&SCOI2016美味】

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

  3. BZOJ4571 [Scoi2016]美味 【主席树】

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

  4. BZOJ4571:[SCOI2016]美味(主席树,贪心)

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

  5. [BZOJ4571][SCOI2016]美味(贪心+主席树)

    经典问题,按位贪心,每次需要知道的是”在这一位之前的位都以确定的情况下,能否找到这一位是0/1的数”,这就是在询问[L,R]内某个值域区间是否有数,主席树即可. #include<cstdio& ...

  6. BZOJ4571: [Scoi2016]美味【主席树】【贪心】

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

  7. 2018.10.14 bzoj4571: [Scoi2016]美味(主席树)

    传送门 自认为是一道思想很妙的题. 直接分析问题. 如果没有xxx的干扰直接上可持久化01trie01trie01trie走人. 但现在有了xxx这个偏移量. 相当于把整个01trie01trie01 ...

  8. 【BZOJ4571】[Scoi2016]美味 主席树

    [BZOJ4571][Scoi2016]美味 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值 ...

  9. 【BZOJ4571】美味(主席树)

    [BZOJ4571]美味(主席树) 题面 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 ...

随机推荐

  1. andriod学习二 设置开发环境

    1.官方环境搭建步骤     http://developer.android.com/sdk/installing/index.html         包括:下载JDK6,Eclipse 3.6, ...

  2. meta-data获取小结

    android 开发中:   在AndroidManifest.xml中,<meta-data>元素可以作为子元素,   被包含在<activity>.<applicat ...

  3. 在VMware虚拟机下安装Linux CentOS7

    1.首先下载并安装VMware虚拟机,下载地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluatio ...

  4. Eclipse上安装Activiti插件

    今天我们来讲下如何在Eclipse上安装Activiti插件,以后我们要用这个插件来画流程设计图: 这个插件名字是:Activiti BPMN 2.0 designer 具体使用,可以参考官方用户指南 ...

  5. redis 面试

    Redis有哪些数据结构? 字符串String.字典Hash.列表List.集合Set.有序集合SortedSet. 如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog.G ...

  6. 一道java笔试题

    输入一串用空格隔开的数字串,对于数字串的奇数位按升序排序,偶数位按降序排序. 示例输入: 4 6 2 3 6 7 8 1 处理过程: 奇数位:4 2 6 8 升序排序结果: 2 4 6 8 偶数位:6 ...

  7. POJ 2104 K-th Number(划分树)

    Description You are working for Macrohard company in data structures department. After failing your ...

  8. 软工2017团队协作第七周——个人PSP

    10.27 --11.2本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 开始时间                结束时间 中断时间 实际用时 ...

  9. 11.24Daily Scrum(4)

    人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.1007 实现视频浏览的功能 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.1008 实现视频浏 ...

  10. 福大软工1816:beta版本冲刺前准备

    BETA 版冲刺前准备 队名:第三视角 作业链接 组长博客 应作业要求为了更加顺利地开展beta版本的冲刺,上次的alpha版本展示后,我们组对之前开发过程中存在的各种问题进行了全面的讨论,并对其进行 ...