[洛谷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 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的 ...
随机推荐
- 软工1816 · Alpha冲刺(7/10)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 学会了POSTMAN的使用,对后端已经完成的接口进行了收发消息正确性的验证 推 ...
- 团队Alpha冲刺(八)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- ERROR----java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
2013-4-28 13:17:57 org.apache.catalina.core.StandardContext filterStart 严重: Exception starting filte ...
- lintcode-408-二进制求和
408-二进制求和 给定两个二进制字符串,返回他们的和(用二进制表示). 样例 a = 11 b = 1 返回 100 标签 二进制 字符串处理 脸书 思路 先相加,在处理进位,为了方便操作,将选字符 ...
- 使用coding.net上传项目
鉴于上一次上传托管代码的惨烈教训,痛定思痛,决定把这次使用cooding.net上传的过程记录下来.也算是一篇简单的cooding初级使用教程了. 1.首先在cooding上新建项目 (1)填写项目名 ...
- mnist测试
第一步:进入caffe目录 第二步:获取mnist数据集 ./data/mnist/get_mnist.sh 第三步:创建lmdb ./examples/mnist/create_mnist.sh 第 ...
- JDK源码分析 – HashMap
HashMap类的申明 HashMap的定义如下: public class HashMap<K,V> extends AbstractMap<K,V> implements ...
- erlang随机排列数组
参考karl's answer 1> L = lists:seq(1,10). [1,2,3,4,5,6,7,8,9,10] Associate a random number R with e ...
- 配置ip,使你的虚拟机可以被别人访问到,搭建服务器必备
我么一般配置虚拟机的时候,我们总是喜欢使用虚拟网段,但是这样别人有可能ping不通我的虚拟机的. 若是我们想要别人ping我们的ip ,则我们要跟改以下几个操作: 在我们的网络源的源模式中,你若是想在 ...
- 微信小程序组件 360
data: { nums: 1, start: '', // change:'' // 上一部记忆数据 mid: '' }, mytouchmove: function (e) { var start ...