洛谷题目链接:[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]美味的更多相关文章

  1. 洛谷P3293 [SCOI2016]美味(主席树)

    传送门 据说这题做法叫做可持久化trie树?(然而我并不会) 首先考虑一下贪心,从高位到低位枚举,如果能选1肯定比选0优 假设已经处理到了$b$的第$i$位,为1(为0的话同理就不说了) 那么只有当$ ...

  2. 洛谷P3295 [SCOI2016]萌萌哒 题解

    洛谷P3295 [SCOI2016]萌萌哒 题目描述 公式粘过来就乱了,还是去洛谷看题吧 分析 如果暴力解决的话就是使用并查集把位数相同的数位并在一起.比如区间[1,2]和区间[3,4]的数字完全相同 ...

  3. [洛谷P3292] [SCOI2016]幸运数字

    洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...

  4. 洛谷$P$3293 美味 $[SCOI2016]$ 主席树

    正解:主席树 解题报告: 传送门! 挺有趣的,至少我不会$QAQ$(虽然我不会的多了去了$QAQ$ 如果没有这个所谓美味度限制可以直接线段树水过去嘛$QwQ$ 然后现在问的是个异或运算后的结果,关于异 ...

  5. luogu P3293 [SCOI2016]美味

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

  6. P3293 [SCOI2016]美味

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

  7. 洛谷P3292 [SCOI2016]幸运数字 线性基+倍增

    P3292 [SCOI2016]幸运数字 传送门 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在 ...

  8. 洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边

    题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要 ...

  9. 洛谷P3292 [SCOI2016] 幸运数字 [线性基,倍增]

    题目传送门 幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的 ...

随机推荐

  1. 关于算法的时间复杂度O(f(n))

    (一)算法时间复杂度定义: 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间量度,记作:T(n ...

  2. virtual judge 本地部署方案

    这是一种将自己的电脑当作服务器来部署一个vj的方法,我也是参考前辈们的做法稍作了改动,如果在服务器上部署的话需要在细节上稍作改动: 一.什么是Virtual Judge? vj的工作原理什么?  vj ...

  3. dubbo源码分析1——负载均衡

    dubbo中涉及到的负载均衡算法只要有四种:Random LoadBalance(随机均衡算法).RoundRobin LoadBalance(权重轮循均衡算法).LeastAction LoadBa ...

  4. 栈和队列在python中的实现

    栈和队列是两种基本的数据结构,同为容器类型.两者根本的区别在于: stack:后进先出 queue:先进先出 PS:stack和queue是不能通过查询具体某一个位置的元素而进行操作的.但是他们的排列 ...

  5. 转载免安装版mysql的配置

    解压到自定义目录,我这里演示的是D:\wamp\mysql\   复制根目录下的my-default.ini,改名为my.ini,my.ini用下面内容替换 #以下是复制内容,这行可不复制 [clie ...

  6. PHP面向对象之重写

    覆盖(override): 基本概念 覆盖,又叫“重写”: 含义: 将一个类从父类中继承过来的属性和方法“重新定义”——此时相当于子类不想用父类的该属性或方法,而是想要定义. 覆盖的现实需要: 对于一 ...

  7. django的第一个问题

    /usr/local/lib/python2.7/dist-packages/allauth/account/utils.py in setup_user_email, line 258 /usr/l ...

  8. java 使用volatile实现线程数据的共享

    java 使用volatile实现线程数据的共享 直接上代码看效果: public class VolatileTest extends Thread { private volatile boole ...

  9. Connections between cities HDU - 2874(最短路树 lca )

    题意: 给出n个点m条边的图,c次询问 求询问中两个点间的最短距离. 解析: Floyd会T,所以用到了最短路树..具体思想为: 设k为u和v的最近公共祖先 d[i] 为祖结点到i的最短距离  则di ...

  10. CF398B Painting The Wall 概率期望

    题意:有一个 $n * n$ 的网格,其中 $m$ 个格子上涂了色.每次随机选择一个格子涂色,允许重复涂,求让网格每一行每一列都至少有一个格子涂了色的操作次数期望.题解:,,这种一般都要倒推才行.设$ ...