BZOJ4571: [Scoi2016]美味【主席树】【贪心】
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
很僵硬。。。一开始没有想到二进制Trie和值域线段树的转化。。。长知识了
Menci的blog写的挺好的
思路
首先考虑一下假设没有区间的限制怎么做?全局查找最优
因为如果没有加的操作我们很显然是可以在二进制Trie上贪心的
然是加上了加的操作怎么办?
就不要强行把加和异或联系起来了
假设我们从高到低已经选了\(tmp\),当前如果深度是\(dep\)
我们考虑这一位如果可能是0,那么一定在\([tmp,tmp+(1<<tmp)-1]\)范围内有数
如果考虑\(x_i\),就变成了在\([tmp-x_i,tmp+(1<<tmp)-1-x_i]\)范围内有数了
但是直接在Trie上做区间统计非常不方便怎么办?就考虑搬到权值线段树
实际上这两种数据结构的形态是完全相同的,只是实现方式不太一样
那么权值线段树是不是可以实现Trie的功能呢?答案是肯定的
所以就可以用权值线段树代替Trie了
这样如果需要加上区间的限制,就直接上个主席树就可以了。。。
或者你暴力可持久化Trie我没意见。。。。
//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
//typename
typedef long long ll;
//convenient for
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
//inf of different typename
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
//fast read and write
template <typename T>
void Read(T &x) {
  bool w = 1;x = 0;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-') w = 0, c = getchar();
  while (isdigit(c)) {
    x = (x<<1) + (x<<3) + c -'0';
    c = getchar();
  }
  if (!w) x = -x;
}
template <typename T>
void Write(T x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  if (x > 9) Write(x / 10);
  putchar(x % 10 + '0');
}
//----------------------------------------------
const int N = 2e5 + 10;
int rt[N], siz[N * 20], ls[N * 20], rs[N * 20], tot = 0;
void pushup(int t) {
  siz[t] = siz[ls[t]] + siz[rs[t]];
}
void build(int &t, int l, int r) {
  t = ++tot;
  if (l == r) return ;
  int mid = (l + r) >> 1;
  build(ls[t], l, mid);
  build(rs[t], mid + 1, r);
}
void insert(int &t, int last, int l, int r, int vl, int dep) {
  t = ++tot;
  siz[t] = siz[last] + 1;
  ls[t] = ls[last];
  rs[t] = rs[last];
  if (l == r) return;
  int mid = (l + r) >> 1;
  if (vl & (1 << (dep - 1))) insert(rs[t], rs[last], mid + 1, r, vl, dep - 1);
  else insert(ls[t], ls[last], l, mid, vl, dep - 1);
  pushup(t);
}
bool query(int t, int last, int l, int r, int ql, int qr) {
  if (ql > qr || l > r) return 0;
  if (ql <= l && r <= qr) return siz[t] > siz[last];
  int mid = (l + r) >> 1;
  if (qr <= mid) return query(ls[t], ls[last], l, mid, ql, qr);
  else if (ql > mid) return query(rs[t], rs[last], mid + 1, r, ql, qr);
  else return query(ls[t], ls[last], l, mid, ql, mid) || query(rs[t], rs[last], mid + 1, r, mid + 1, qr);
}
int n, q, a[N], b[N], x[N], l[N], r[N];
void init() {
  Read(n), Read(q);
  fu(i, 1, n) Read(a[i]);
  fu(i, 1, q) Read(b[i]), Read(x[i]), Read(l[i]), Read(r[i]);
}
int main() {
  //freopen("1.in", "r", stdin);
  init();
  int maxv = 0;
  fu(i, 1, n) maxv = max(maxv, a[i]);
  fu(i, 1, q) maxv = max(maxv, max(b[i], x[i]));
  int m = 1, dep = 0;
  while (m < maxv + 1) m <<= 1, ++dep;
  m--;
  build(rt[0], 0, m);
  fu(i, 1, n) insert(rt[i], rt[i - 1], 0, m, a[i], dep);
  fu(i, 1, q) {
    int ans = 0, tmp = 0;
    fd(j, dep, 0) {
      int now = 1 << j;
      if (b[i] & now) {
        if (query(rt[r[i]], rt[l[i] - 1], 0, m, max(0, tmp - x[i]), max(0, tmp - x[i] + now - 1))) {
          ans |= now;
        } else {
          tmp |= now;
        }
      } else {
        if (query(rt[r[i]], rt[l[i] - 1], 0, m, max(0, tmp - x[i] + now), max(0, tmp - x[i] + now * 2 - 1))) {
          ans |= now;
          tmp |= now;
        }
      }
    }
    Write(ans), putchar('\n');
  }
  return 0;
}
BZOJ4571: [Scoi2016]美味【主席树】【贪心】的更多相关文章
- BZOJ4571:[SCOI2016]美味(主席树,贪心)
		Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi . 因此,第 ... 
- BZOJ.4571.[SCOI2016]美味(主席树 贪心)
		题目链接 要求 \(b\ xor\ (a_j+x)\) 最大,应让 \(a_j+x\) 的最高位尽可能与b相反.带个减法Trie树好像很难做?反正我不会. 从最高位开始,如果这位b是0/1,判断是否存 ... 
- bzoj4571/luogu3293 美味 (主席树+贪心)
		首先想到建出可持久化trie树然后在上面贪心,但是它加了一个数所以不能这么做 但依然可以贪心,仿照上面那个的过程,如果设y是在第i位上^b是1的数(前面的位数已经贪好了),我只要在[l,r]范围内能有 ... 
- 【BZOJ4571】[Scoi2016]美味 主席树
		[BZOJ4571][Scoi2016]美味 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值 ... 
- P3293 [SCOI2016]美味 主席树+按位贪心
		给定长度为 \(n\) 序列 \(a[i]\) ,每次询问区间 \([l,r]\) ,并给定 \(b,x\) 中的一个数 \(p=a[i]\) ,使得最大化 \(b \bigoplus p^x\) 主 ... 
- [SCOI2016]美味——主席树+按位贪心
		原题戳这里 题解 让异或值最大显然要按位贪心,然后我们还发现加上一个\(x_i\)的效果就是所有\(a_i\)整体向右偏移了,我们对于\({a_i}\)开个主席树,支持查询一个区间中有多少个在\([L ... 
- bzoj 4571: [Scoi2016]美味 (主席树)
		链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 题面; 4571: [Scoi2016]美味 Time Limit: 30 Sec ... 
- BZOJ4517[Scoi2016]美味——主席树
		题目描述 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 i 位顾客认为 ... 
- bzoj 4571 [Scoi2016]美味——主席树
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 按位考虑,需要的就是一个区间:比如最高位就是(2^k -x). 对于不是最高位的位置该 ... 
- [BZOJ4571][SCOI2016]美味(贪心+主席树)
		经典问题,按位贪心,每次需要知道的是”在这一位之前的位都以确定的情况下,能否找到这一位是0/1的数”,这就是在询问[L,R]内某个值域区间是否有数,主席树即可. #include<cstdio& ... 
随机推荐
- Python 自带IDLE 如何打开
- oracle extract 函数简介
			oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分 //语法如下: EXTRACT ( { YEA ... 
- 浅谈history对象以及路由插件原理
			简介 History对象最初设计用来表示窗口的浏览历史,但是,出于隐私方面的原因,History对象不再允许脚本访问已经访问过的实际URL.虽然,我们不清楚历史URL,但是,我们可以通过History ... 
- FFmpeg 入门(5):视频同步
			本文转自:FFmpeg 入门(5):视频同步 | www.samirchen.com 视频如何同步 在之前的教程中,我们已经可以开始播放视频了,也已经可以开始播放音频了,但是视频和音频的播放还未同步, ... 
- Vue学习笔记之Vue学习前的准备工作
			0x00 起步 1.扎实的HTML/CSS/Javascript基本功,这是前置条件. 2.不要用任何的构建项目工具,只用最简单的<script>,把教程里的例子模仿一遍,理解用法.不推荐 ... 
- 通用Linux内核优化配置
			通用Linux内核优化配置 针对CentOS6.CentOS7.Redhat6.Redhat7等系统 net.ipv4.ip_forward = net.ipv4.conf. net.ipv4.con ... 
- 使用Git【转】
			本文转载自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 我们一直用GitHub ... 
- root权限和sudo得到权限的区别
			参考: 知乎 命令前加sudo执行和用真正的root用户执行有什么区别?pansz的回答 root用户和sudo使用root权限的区别 变换用户身份为root的方法su 与 sudo root权限和s ... 
- UVa 10655 n次方之和(矩阵快速幂)
			https://vjudge.net/problem/UVA-10655 题意: 输入非负整数p,q,n,求a^n+b^n的值,其中a和b满足a+b=p,ab=q. 思路: 递推式转化成矩阵的规律: ... 
- 51nod  1225 余数的和  数学
			1225 余数之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 F(n) = (n % 1) + (n % 2) + (n % 3) + ... ... 
