【bzoj4571&&SCOI2016美味】
4571: [Scoi2016]美味
Time Limit: 30 Sec Memory Limit: 256 MB
Submit: 656 Solved: 350
[Submit][Status][Discuss]
Description
一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n)。有 m 位顾客,第 i 位顾客的期
望值为 bi,而他的偏好值为 xi 。因此,第 i 位顾客认为第 j 道菜的美味度为 bi XOR (aj+xi),XOR 表示异或
运算。第 i 位顾客希望从这些菜中挑出他认为最美味的菜,即美味值最大的菜,但由于价格等因素,他只能从第
li 道到第 ri 道中选择。请你帮助他们找出最美味的菜。
Input
第1行,两个整数,n,m,表示菜品数和顾客数。
第2行,n个整数,a1,a2,...,an,表示每道菜的评价值。
第3至m+2行,每行4个整数,b,x,l,r,表示该位顾客的期望值,偏好值,和可以选择菜品区间。
1≤n≤2×10^5,0≤ai,bi,xi<10^5,1≤li≤ri≤n(1≤i≤m);1≤m≤10^5
Output
输出 m 行,每行 1 个整数,ymax ,表示该位顾客选择的最美味的菜的美味值。
Sample Input
4 4
1 2 3 4
1 4 1 4
2 3 2 3
3 2 3 3
4 1 2 4
Sample Output
9
7
6
7
三步走
●维护xor最大值的话用trie树可以搞一搞
●维护区间xor最大值可以用可持久化trie树
●维护区间xor并支持加减的就是可持久化权值线段树了,这就是本题的算法,用贪心+主席树实现
贪心?肯定先确定最高位使得xor后此位为1,由此得到
策略1:从二进制高位向低位贪心,尽量满足 b的i位与(a[j]+x)的i位不同
怎么判断第i位是否可以不同?可以假设(a[j]+x)的i位与b的i位不同,来确定所选的数的第i位,再判定假设是否合法。
合法的条件是什么?记已确定的数为ans,只用查找区间内是否存在数这样的满足条件
1.前面位和ans相同
2.此位满足已确定的数
不太容易懂,举一个例子:
假设b的当前位为1,我们应尽量使a[j]+x当前位为0,前面位确定为ans,ans第i位设定为0,查找区间内是否存在 在[ans,ans+(1<<i)-1]之内的数,如果有,则此位可以为0

判断区间的数的个数,权值线段树
但此时我们注意到查找是双关键字的,一个是区间一个是权值,所以用主席树来完成操作
总结得出
策略2:用主席树判断区间数的存在性问题来确定当前位究竟是什么
到了这里,此题也就差不多了,但有几个细节需要注意
●主席树空间开够(我就是这里错了好久--为什么dev不报RE而是乱搞数组啊!!)
●由于我们查询的数是a[j]+x,而树中插入的是a[],所以查询区间统一减去x并考虑区间是否超界
●最后注意,我们的到的ans是选出来的数,所以输出时要xor b
没有了-------------------------------------------------------------------
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define ll long long
#define N 200005
#define mx (1<<18)-1
using namespace std;
int n,m,a[N],rt[N],ls[N<<5],rs[N<<5],sum[N<<5],sz;
void insert(int pre,int &u,int l,int r,int pos){
u=++sz;ls[u]=ls[pre];rs[u]=rs[pre];sum[u]=sum[pre]+1;
if(l==r)return;int mid=(l+r)>>1;
if(pos<=mid)insert(ls[pre],ls[u],l,mid,pos);
else insert(rs[pre],rs[u],mid+1,r,pos);
} int query(int pre,int u,int l,int r,int L,int R){
if(L<=l&&r<=R)return sum[u]-sum[pre];
int mid=(l+r)>>1;int t=0;
if(L<=mid)t+=query(ls[pre],ls[u],l,mid,L,R);
if(R>mid)t+=query(rs[pre],rs[u],mid+1,r,L,R);
return t;
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
insert(rt[i-1],rt[i],0,mx,a[i]);
for(int i=1;i<=m;i++){
int b,x,l,r;
scanf("%d%d%d%d",&b,&x,&l,&r);
int ans=0;
for(int j=17;j>=0;j--){
if(b&(1<<j)){
int L=max(ans-x,0),R=ans+(1<<j)-x-1;
if(R<0||!query(rt[l-1],rt[r],0,mx,L,R))ans^=(1<<j);
}
else{
ans^=(1<<j);
int L=max(ans-x,0),R=ans+(1<<j)-x-1;
if(R<0||!query(rt[l-1],rt[r],0,mx,L,R))ans^=(1<<j);
}
}
printf("%d\n",ans^b);
}
return 0;
}
【bzoj4571&&SCOI2016美味】的更多相关文章
- bzoj4571: [Scoi2016]美味
4571: [Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 275 Solved: 141 [Submit][Status][ ...
- BZOJ4571:[SCOI2016]美味(主席树,贪心)
Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi . 因此,第 ...
- [BZOJ4571][SCOI2016]美味(贪心+主席树)
经典问题,按位贪心,每次需要知道的是”在这一位之前的位都以确定的情况下,能否找到这一位是0/1的数”,这就是在询问[L,R]内某个值域区间是否有数,主席树即可. #include<cstdio& ...
- BZOJ4571: [Scoi2016]美味【主席树】【贪心】
Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 ...
- BZOJ4571 [Scoi2016]美味 【主席树】
题目 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 i 位顾客认为第 ...
- 2018.10.14 bzoj4571: [Scoi2016]美味(主席树)
传送门 自认为是一道思想很妙的题. 直接分析问题. 如果没有xxx的干扰直接上可持久化01trie01trie01trie走人. 但现在有了xxx这个偏移量. 相当于把整个01trie01trie01 ...
- 【BZOJ4571】[Scoi2016]美味 主席树
[BZOJ4571][Scoi2016]美味 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值 ...
- 【BZOJ4571】美味(主席树)
[BZOJ4571]美味(主席树) 题面 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 ...
- bzoj 4571: [Scoi2016]美味 (主席树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 题面; 4571: [Scoi2016]美味 Time Limit: 30 Sec ...
随机推荐
- 视频聊天插件:AnyChat使用攻略之iOS开发指南
AnyChat使用攻略之iOS开发指南 这套攻略主要指导刚开始使用AnyChat SDK For iOS的同学,快速搭建SDK环境,和实现音视频开发流程. (需要工程案例文件可联系我们) 在iOS平台 ...
- NetFPGA Demo ——reference_router_nf1_cml
NetFPGA Demo --reference_router_nf1_cml 前言 本博文主要介绍了reference_router_nf1_cml该demo的一路运行,以及一路上艰难跑通遇到的坑. ...
- 在ArcGIS中导出现有mxd的style文件
做好的地图包含许多地图符号,这是之前花了很多功夫做的,怎么把它导出来再用呢? 在ArcGIS中右键工具栏,customize,选择command选项卡,在搜索框中输入style ,选择too ...
- div+css命名规则
作为一个前端菜鸟,进公司的第一个项目就是中途从外包公司接过来的公司网站,在别人写过了的基础上接着写,命名什么的,简直不要太痛苦. 目前,这个网站已经完成,但是被后台人员指出命名不规范.有心想解释一两句 ...
- 【learning】多项式相关(求逆、开根、除法、取模)
(首先要%miskcoo,这位dalao写的博客(这里)实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,下面这篇东西是自己对其博客学习后的一些总结和想法,大部分是按照其博客里 ...
- Python之旅_第一章Python入门
一.编程语言分类 1.机器语言:即计算机能听懂的二进制语言,0000 0001,直接操控硬件: 2.汇编语言:简写的英文标识符代替二进制语言,本质同样是直接操控硬件: 3.高级语言:用更贴近人类的语言 ...
- lodash源码分析之获取数据类型
所有的悲伤,总会留下一丝欢乐的线索,所有的遗憾,总会留下一处完美的角落,我在冰峰的深海,寻找希望的缺口,却在惊醒时,瞥见绝美的阳光! --几米 本文为读 lodash 源码的第十八篇,后续文章会更新到 ...
- sql server 常用的查询语句
最近在加强sql 语句的学习,整理一下基本语法,现在记录下 select * from dbo.cangku where city='河南' select distinct(city), cangk ...
- flask 视图函数的使用
flask框架 视图函数当中 各种实用情况简单配置 1 建立连接 2 路由参数 3 返回网络状态码 4 自定义错误页面 5 重定向 6 正则url限制 和 url 优化 7 设置和获取cookie # ...
- 算法 排序NB二人组 堆排序 归并排序
参考博客:基于python的七种经典排序算法 常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储 ...