[洛谷P3293] [SCOI2016]美味
洛谷题目链接:[SCOI2016]美味
题目描述
一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1<=i<=n)。有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi 。因此,第 i 位顾客认为第 j 道菜的美味度为 bi XOR (aj+xi),XOR 表示异或运算。
第 i 位顾客希望从这些菜中挑出他认为最美味的菜,即美味值最大的菜,但由于价格等因素,他只能从第 li 道到第 ri 道中选择。请你帮助他们找出最美味的菜。
输入输出格式
输入格式:
第1行,两个整数,n,m,表示菜品数和顾客数。
第2行,n个整数,a1,a2,...,an,表示每道菜的评价值。
第3至m+2行,每行4个整数,b,x,l,r,表示该位顾客的期望值,偏好值,和可以选择菜品区间。
输出格式:
输出 m 行,每行 1 个整数,ymax ,表示该位顾客选择的最美味的菜的美味值。
输入输出样例
输入样例#1:
4 4
1 2 3 4
1 4 1 4
2 3 2 3
3 2 3 3
4 1 2 4
输出样例#1:
9
7
6
7
说明
对于所有测试数据,\(1<=n<=2*10^ 5,0<=ai,bi,xi<10 ^ 5,1<=li<=ri<=n(1<=i<=m),1<=m<=10^5\)
题解: 如果没有这个\(+x\)的操作,就可以直接用\(trie\)查询最大异或值了,那么有这个\(+x\)的操作要怎么办呢?
我们还是一样的建出\(trie\)树,然后以二进制枚举每一位的值.
假设现在正在枚举第\(i\)位的答案\((i\in \{0, 1, 2, ...\})\),填满第\(i\)位之前的结果为\(ans\),那么以贪心的思想,这一位填入\(((1\ xor\ {((b>>i)\&1))}<<i)\)一定是最优的,然后填完这一位之后后面还有\(i\)个位置可以填入\(0\)或\(1\),那么这些数字任意填入后的取值范围就是\([0,(1<<i)-1]\),如果在\(trie\)树中可以找到存在值在\([ans+((1\ xor\ {((b>>i)\&1))}<<i)-x,ans+((1\ xor\ {((b>>i)\&1))}<<i)-(1<<i)-1]\)范围内的,说明这一位可以贪心的选,否则只能在这一位填入\((({((b>>i)\&1))}<<i)\).
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n, m, a[N], cnt = 0, root[N], ans = 0, mx;
struct trie{ int ch[2], size; }t[N*20];
void update(int &x, int last, int pos, int l = 0, int r = mx){
x = ++cnt; t[x] = t[last], t[x].size++;
if(l == r) return; int mid = (l+r>>1);
if(pos <= mid) update(t[x].ch[0], t[last].ch[0], pos, l, mid);
else update(t[x].ch[1], t[last].ch[1], pos, mid+1, r);
}
int query(int x, int last, int ql, int qr, int l = 0, int r = mx){
if(ql <= l && r <= qr) return t[x].size-t[last].size;
int mid = (l+r>>1), sum = 0;
if(t[x].ch[0] && ql <= mid) sum += query(t[x].ch[0], t[last].ch[0], ql, qr, l, mid);
if(t[x].ch[1] && mid < qr) sum += query(t[x].ch[1], t[last].ch[1], ql, qr, mid+1, r);
return sum;
}
int check(int x, int y, int l, int r){
l = max(0, l), r = min(r, mx); if(l > r) return 0;
return query(root[y], root[x], l, r);
}
int main(){
int b, x, l, r; cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i], mx = max(mx, a[i]);
for(int i = 1; i <= n; i++) update(root[i], root[i-1], a[i]);
for(int i = 1; i <= m; i++){
cin >> b >> x >> l >> r, ans = 0;
for(int j = 19; j >= 0; j--){
int tmp = ans+((((b >> j) & 1) ^ 1) << j);
if(check(l-1, r, tmp-x, tmp+(1 << j)-1-x)) ans = tmp;
else ans += (((b >> j) & 1) << j);
}
cout << (ans^b) << endl;
}
return 0;
}
[洛谷P3293] [SCOI2016]美味的更多相关文章
- 洛谷P3293 [SCOI2016]美味(主席树)
传送门 据说这题做法叫做可持久化trie树?(然而我并不会) 首先考虑一下贪心,从高位到低位枚举,如果能选1肯定比选0优 假设已经处理到了$b$的第$i$位,为1(为0的话同理就不说了) 那么只有当$ ...
- 洛谷P3295 [SCOI2016]萌萌哒 题解
洛谷P3295 [SCOI2016]萌萌哒 题目描述 公式粘过来就乱了,还是去洛谷看题吧 分析 如果暴力解决的话就是使用并查集把位数相同的数位并在一起.比如区间[1,2]和区间[3,4]的数字完全相同 ...
- [洛谷P3292] [SCOI2016]幸运数字
洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...
- 洛谷$P$3293 美味 $[SCOI2016]$ 主席树
正解:主席树 解题报告: 传送门! 挺有趣的,至少我不会$QAQ$(虽然我不会的多了去了$QAQ$ 如果没有这个所谓美味度限制可以直接线段树水过去嘛$QwQ$ 然后现在问的是个异或运算后的结果,关于异 ...
- luogu P3293 [SCOI2016]美味
题目描述 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1<=i<=n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi .因此,第 ...
- P3293 [SCOI2016]美味
题目描述 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1<=i<=n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi .因此,第 ...
- 洛谷P3292 [SCOI2016]幸运数字 线性基+倍增
P3292 [SCOI2016]幸运数字 传送门 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在 ...
- 洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边
题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要 ...
- 洛谷P3292 [SCOI2016] 幸运数字 [线性基,倍增]
题目传送门 幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的 ...
随机推荐
- Centos 关闭图形界面
查看/etc/inittab如下: # systemd uses 'targets' instead of runlevels. # by default, there are two main ta ...
- ncnblogs.com的用户体验
你是什么样的用户, 有什么样的心理, 对cnblogs 的期望值是什么? 我是一名普通的学生,上cnblogs的期望是发表博客完成老师布置的任务. 当你第一次使用cnblogs 的功能的时候, 碰到了 ...
- 通俗理解Hilbert希尔伯特空间
作者:qang pan 链接:https://www.zhihu.com/question/19967778/answer/28403912 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权, ...
- 关于C语言的问卷调查!!!!!!!!!!
1.我对自己的未来是现在通过大学这一平台逐渐接触社会,通过大学的这段时间学习C语言等计算机语言技术,有一技之长在手,并且通过大学时间丰富自己的业余生活,加强自己的人脉关系,为未来在事业上的发展做准备! ...
- YARN中用的作业调度算法:DRF(Dominant Resource Fairness)
在Mesos和YARN中,都用到了dominant resource fairness算法(DRF),它不同于hadoop基于slot-based实现的fair scheduler和capacity ...
- 给新建的kvm虚拟机创建网络接口
(一)首先必须创建网卡连接桥接口的启动脚本和停止脚本,其中脚本中的 $1:表示为虚拟机的网卡的右边接口,这两个脚本就是讲虚拟机的网卡的右边接口接在网桥上,实现桥接模型 # 1:/etc/qem ...
- python配置文件读取
在代码实现的过程中,我们经常选择将一些固定的参数值写入到一个单独的配置文件中.在python中读取配置文件官方提供了configParser方法. 主要有如下方法(找官文): (这家伙很懒,直接复 ...
- Linux 常用指令【持续更新】
在学校的时候学过一些简单的 Linux 命令,主要是文件的创建拷贝解压等操作,最近在电脑上安装了一个CentOS6.8版本的基本版,纯命令行操作. ../ 代表上一级目录 ./ 代表本级目录 / 代表 ...
- 在dbgrid中如何多行选中记录(ctl与shift均可用)
在dbgrid中如何多行选中记录(ctl与shift均可用),设置dbgrid的dgmultiselect为true,只有ctl好用而shift不好用,如何使shift也好用 Dbgrid源代码:pr ...
- 网页移动到一个高度后加载网页元素【getBoundingClientRect好用】
$(window).scroll(function () { var windowH = $(window).height();//取可视窗口的高度 ).getBoundingClientRect() ...