[Scoi2016]美味

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 721  Solved: 391
[Submit][Status][Discuss]

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

HINT

 

Source

题解:

区间最大异或值的经典做法是可持久化trie,但是加上一个数的话可持久化trie就变得非常的扯淡

考虑可持久化trie其实可以等价为一颗上限为2^k-1的主席树,在trie上确定一位其实相当于将答案的区间缩小的一半,也就是在主席树上向下走一层

当所有数加上x之后,我们在主席树上走的时候就不能直接调用siz[son[x][0]],但是因为所有数都被加了,所以我们其实要查询的是左子树的区间向前窜x位之后的区间有没有数,这样的话每次走的时候在主席树上重新查[l-x,mid-x]或者[mid+1-x,r-x]来判断应该往哪边走即可,复杂度多了个log,但是n=2*10^5,不虚

然后就过了

时间复杂度O(m log^2 n)

 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N=<<;
const int maxn=;
int n,m,tot;
int rt[maxn];
struct node
{
int ls,rs,siz;
}s[maxn*];
void insert(int x,int &y,int l,int r,int a)
{
y=++tot,s[y].siz=s[x].siz+;
if(l==r) return ;
int mid=(l+r)>>;
if(a<=mid) s[y].rs=s[x].rs,insert(s[x].ls,s[y].ls,l,mid,a);
else s[y].ls=s[x].ls,insert(s[x].rs,s[y].rs,mid+,r,a);
}
int query(int l,int r,int x,int y,int a,int b)
{
if(a<=l&&r<=b) return s[x].siz-s[y].siz;
int mid=(l+r)>>;
if(b<=mid) return query(l,mid,s[x].ls,s[y].ls,a,b);
if(a>mid) return query(mid+,r,s[x].rs,s[y].rs,a,b);
return query(l,mid,s[x].ls,s[y].ls,a,b)+query(mid+,r,s[x].rs,s[y].rs,a,b);
}
inline int find(int l,int r,int a,int b)
{
int i,j=,d;
for(i=<<;i;i>>=)
{
d=(b&i)>;
if(d&&!query(,N,rt[r],rt[l-],j-a,j+i-a-)) j+=i;
if(!d&&query(,N,rt[r],rt[l-],j+i-a,j+i+i-a-)) j+=i;
}
return b^j;
}
inline int rd()
{
int ret=,f=; char gc=getchar();
while(gc<''||gc>'') {if(gc=='-') f=-f; gc=getchar();}
while(gc>=''&&gc<='') ret=ret*+gc-'',gc=getchar();
return ret*f;
}
int main()
{
int i,a,b,c,d;
n=rd(),m=rd();
for(i=;i<=n;i++)
a=rd(),insert(rt[i-],rt[i],,N,a);
for(i=;i<=m;i++)
{
a=rd(),b=rd(),c=rd(),d=rd();
printf("%d\n",find(c,d,b,a));
}
}

bzoj [Scoi2016]美味的更多相关文章

  1. BZOJ 4571: [Scoi2016]美味

    二次联通门 : BZOJ 4571: [Scoi2016]美味 /* BZOJ 4571: [Scoi2016]美味 dalao们都在说这题如果没有加法balabala就可以用可持久化trie解决了 ...

  2. bzoj 4571: [Scoi2016]美味 (主席树)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 题面; 4571: [Scoi2016]美味 Time Limit: 30 Sec   ...

  3. bzoj4571: [Scoi2016]美味

    4571: [Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 275 Solved: 141 [Submit][Status][ ...

  4. 【bzoj4571&&SCOI2016美味】

    4571: [Scoi2016]美味 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 656  Solved: 350[Submit][Status][ ...

  5. [洛谷P3293] [SCOI2016]美味

    洛谷题目链接:[SCOI2016]美味 题目描述 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1<=i<=n).有 m 位顾客,第 i 位顾客的期望值为 ...

  6. 【BZOJ4571】[Scoi2016]美味 主席树

    [BZOJ4571][Scoi2016]美味 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值 ...

  7. BZOJ.4571.[SCOI2016]美味(主席树 贪心)

    题目链接 要求 \(b\ xor\ (a_j+x)\) 最大,应让 \(a_j+x\) 的最高位尽可能与b相反.带个减法Trie树好像很难做?反正我不会. 从最高位开始,如果这位b是0/1,判断是否存 ...

  8. bzoj 4571 [Scoi2016]美味——主席树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 按位考虑,需要的就是一个区间:比如最高位就是(2^k -x). 对于不是最高位的位置该 ...

  9. luogu P3293 [SCOI2016]美味

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

随机推荐

  1. PHP开发基础视频教程

    PHP现今作为互联网运用很广泛的编程语言,市场需求量也越来越高,而PHP开发工程师的薪资也是一路水涨船高,更多的人看到了PHP的发展前景,纷纷都想投入到PHP的开发大军中来,那么对于很多转行或者零基础 ...

  2. struts2默认拦截器defaultStack

    第一次使用Struts2.3.20,前台页面向后台传值,怎么总是提示值为null,查找半天原来是struts配置文件的action中忘记引入defaultStack拦截器了,所以即使Action中万事 ...

  3. MDI和在TabPage

    无奈的.net探索 MDI和在TabPage中增加Form分页? MDI(Multiple Document Interface)是一种在窗口中嵌套窗口的接口, 与之对应的是SDI(Single Do ...

  4. ValueError: option names {'--alluredir'} already added 报错

    运行测试用例 import pytest from WXP2P_2.test_data2.login_case import logindata_error1,logindata_error2,log ...

  5. 一张图看懂苹果MacBook所有屏幕分辨率

    苹果全新12寸超薄MacBook比曾经最薄的MacBook Air更薄,不过却配备了Retina视网膜显示屏.12英寸RetinaMacBook上的显示屏分辨率为2304*1440,虽然不如15寸和1 ...

  6. shell脚本,通过一个shell程序计算n的阶乘。

    [root@localhost ~]# cat jiechen.sh #!/bin/bash #设计一个shell程序计算n的阶乘,要求: #.从命令行接收参数n; #.在程序开始后立即判断n的合法性 ...

  7. 如何用纯 CSS 创作一个永动的牛顿摆

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qKmGaJ 可交互视频教 ...

  8. 五分钟入门 Dingo API

    基于 https://laravel-china.org/doc... 文档更简洁的描述Dingo,直戳重点,注重实践 Django-Book 概述 Dingo API帮助您轻松快速地构建自己的API ...

  9. Python9-迭代器-生成器-day13

    迭代器# print('__iter__' in dir(int))# print('__iter__' in dir(list))# print('__iter__' in dir(dict))# ...

  10. LeetCode(98) Validate Binary Search Tree

    题目 Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined ...