[SCOI2016]美味——主席树+按位贪心
题解
让异或值最大显然要按位贪心,然后我们还发现加上一个\(x_i\)的效果就是所有\(a_i\)整体向右偏移了,我们对于\({a_i}\)开个主席树,支持查询一个区间中有多少个在\([L,R]\)之间的数,查询时考虑一下\(x_i\)的影响就行了
#include <algorithm>
#include  <iostream>
#include   <cstdlib>
#include   <cstring>
#include    <cstdio>
#include    <string>
#include    <vector>
#include     <cmath>
#include     <ctime>
#include     <queue>
#include       <map>
#include       <set>
using namespace std;
#define ull unsigned long long
#define pii pair<int, int>
#define uint unsigned int
#define mii map<int, int>
#define lbd lower_bound
#define ubd upper_bound
#define INF 0x3f3f3f3f
#define IINF 0x3f3f3f3f3f3f3f3fLL
#define vi vector<int>
#define ll long long
#define mp make_pair
#define pb push_back
#define re register
#define il inline
#define N 200000
#define M 100000
#define A 300000
#define LIM 17
int n, m;
int a[N+5];
int nid, root[N+5], sumv[50*N+5], ch[2][50*N+5];
void insert(int o, int &u, int l, int r, int x) {
  u = ++nid;
  sumv[u] = sumv[o]+1;
  ch[0][u] = ch[0][o], ch[1][u] = ch[1][o];
  if(l == r) return ;
  int mid = (l+r)>>1;
  if(x <= mid) insert(ch[0][o], ch[0][u], l, mid, x);
  else insert(ch[1][o], ch[1][u], mid+1, r, x);
}
int query(int o, int u, int l, int r, int L, int R) {
  if(L <= l && r <= R) return sumv[u]-sumv[o];
  int mid = (l+r)>>1, ret = 0;
  if(L <= mid) ret += query(ch[0][o], ch[0][u], l, mid, L, R);
  if(R > mid) ret += query(ch[1][o], ch[1][u], mid+1, r, L, R);
  return ret;
}
int Query(int b, int x, int l, int r) {
  int ans = 0, t = 0;
  for(int bit = LIM; bit >= 0; --bit) {
    if((b>>bit)&1) {
      if(query(root[l-1], root[r], 0, A, max(0, t-x), max(0, t+(1<<bit)-1-x))) {
        ans |= (1<<bit);
      }
      else t |= (1<<bit);
    }
    else {
      if(query(root[l-1], root[r], 0, A, max(0, t+(1<<bit)-x), max(0, t+(1<<(bit+1))-1-x))) {
        t |= (1<<bit);
        ans |= (1<<bit);
      }
    }
  }
  return ans;
}
int main() {
  scanf("%d%d", &n, &m);
  for(int i = 1; i <= n; ++i) scanf("%d", &a[i]), insert(root[i-1], root[i], 0, A, a[i]);
  for(int i = 1, b, x, l, r; i <= m; ++i) {
    scanf("%d%d%d%d", &b, &x, &l, &r);
    printf("%d\n", Query(b, x, l, r));
  }
  return 0;
}
												
											[SCOI2016]美味——主席树+按位贪心的更多相关文章
- P3293 [SCOI2016]美味 主席树+按位贪心
		
给定长度为 \(n\) 序列 \(a[i]\) ,每次询问区间 \([l,r]\) ,并给定 \(b,x\) 中的一个数 \(p=a[i]\) ,使得最大化 \(b \bigoplus p^x\) 主 ...
 - BZOJ.4571.[SCOI2016]美味(主席树 贪心)
		
题目链接 要求 \(b\ xor\ (a_j+x)\) 最大,应让 \(a_j+x\) 的最高位尽可能与b相反.带个减法Trie树好像很难做?反正我不会. 从最高位开始,如果这位b是0/1,判断是否存 ...
 - BZOJ4571:[SCOI2016]美味(主席树,贪心)
		
Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi . 因此,第 ...
 - 【BZOJ4571】[Scoi2016]美味 主席树
		
[BZOJ4571][Scoi2016]美味 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 ...
 - 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]美味【主席树】【贪心】
		
Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 ...
 - bzoj 4571 美味 —— 主席树
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 区间找异或值最大,还带加法,可以用主席树: 可以按位考虑,然后通过加上之前已经有的答案 ...
 
随机推荐
- 在vue项目中获取当前城市
			
在vue项目中使用百度地图获取当前城市:https://www.jianshu.com/p/0819cfd46712 Vue2 :百度地图bmap:https://www.jianshu.com/p/ ...
 - 同一个ip,不同端口号,cookie会被覆盖
			
参考资料:https://blog.csdn.net/czh500/article/details/80420459
 - 解决element-ui按需引入不了Scrollbar的问题
			
一.报错原因 在我想按需引入element-ui时,突然报错: 这个报错来的有点措不及防.明明在页面当中能够使用,为仕么在单独引入时却不能引用了,真是百思不得其解. 经过在百度上的查找才知道,原来Sc ...
 - 使用Navicat为数据库表建立触发器
			
打开Navicat 打开数据表所在的数据库,右击需要新增字段的数据库表,然后点击[设计表] 此时进入表设计界面 点击[触发器]标签页,输入触发器名称,如trigger1 选择触发条件, ...
 - Nginx 小入门记录 之 初识Nginx和环境准备(一)
			
前置知识准备: 如果还不知道服务器是干什么的,只是刚踏入程序员之路的,大家还是先学习基础,虽然以下文档很简单,但至少知道为什么要学: 一般服务器环境现在基本上都是放在Linux系统上了,如果对Linu ...
 - 虚拟机(VM)安装openwrt-koolshare软路由
			
⒈创建虚拟机 **软路由选择Windows操作系统,因为我们需要在PE环境中进行软路由的写入,固件类型选择BIOS,网络类型选择使用仅主机模式网络,虚拟磁盘类型选择IDE[一定要选择IDE模式],SC ...
 - PostgreSQL练习3
			
select dname,count(ename),avg(sal),sum(sal) from emp e,dept d where e.deptno=d.deptno group by dname ...
 - PHP学习之PHP的语法糖
			
PHP的语法糖 计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用. 常见的PHP的语法糖 echo(),print(),die(),isset(),unset(),i ...
 - 《深入理解 Java 虚拟机》学习 -- Java 内存模型
			
<深入理解 Java 虚拟机>学习 -- Java 内存模型 1. 区别 这里要和 JVM 内存模型区分开来: JVM 内存模型是指 JVM 内存分区 Java 内存模型(JMM)是指一种 ...
 - WebApi 空项目生成帮助文档
			
1.创建一个WebApi的空项目 2.写一些接口,在接口文档中忽略某个方法可以使用 [ApiExplorerSettings(IgnoreApi = true)] 特性 3.在Nuget中添加 Mi ...