点此看题面

大致题意: 给你一个序列\(a\),然后每次询问\(max_{i=l}^r(a_i+x)\ xor\ b\)。

大致思路

首先,我们要知道一个简单的性质:位运算时位与位之间是互不影响的。

而且,要注意:二进制数比大小先看高位。

所以,我们可以从高位往低位枚举,每次判断当前位置是否可以选择为\(1\),且能选尽量选。

那么如何判断当前位是否可以选择为\(1\)呢?

判断当前位是否可以选择为\(1\)

假设当前处理到第\(i\)位,且当前答案为\(ans\)。

由于我们是从高位往低位枚举的,所以第\(i+1\)位\(\sim\)第\(17\)位(\(log_2100000≈17\))实际上已经确定了。

因为我们要尽量让当前位置为\(1\),所以就要让最后取值范围为\([ans+2^i,ans+2^{i+1}-1]\),不难发现,这段区间内的数第\(i\)位都是\(1\)。

既然我们要让\((a_i+x)\text{^}b\in[ans+2^i,ans+2^{i+1}-1]\),由于\(b\)是定值,不难想到将\(\in\)左边式子中的\(b\)移到右边去。

由于\(\text{^}\)运算的性质:\(a\text{^}b=c=>a=b\text{^}c\),可得\(a_i+x\in[(ans+2^i)\text{^}b,(ans+2^{i+1}-1)\text{^}b]\)。

注意,由于第\(1\sim i\)位的数字我们是不管的,所以我们依然要将左边界第\(1\sim i\)位全部改为\(0\),右边界第\(1\sim i\)位全部改为\(1\)。

即左边界\(L=(((ans+2^i)\text{^}b)>>i)<<i\),右边界\(R=((((ans+2^{i+1}-1)\text{^}b)>>i)<<i)+2^i-1\)。

两边同时减去\(x\),得:\(a_i\in[L-x,R-x]\)。

也就是说,如果\([l,r]\)范围内存在一个\(i\)满足\(a_i\in[L-x,R-x]\),就可以将\(ans\)加上\(2^i\)了。

而这可以用主席树来进行维护。

于是这道题就做完了。

代码

#include<bits/stdc++.h>
#define N 200000
#define Log 17
#define Gmax(x,y) (x<(y)&&(x=(y)))
#define Gmin(x,y) (x>(y)&&(x=(y)))
using namespace std;
int n,a[N+5];
class Class_FIO
{
private:
#define Fsize 100000
#define tc() (A==B&&(B=(A=Fin)+fread(Fin,1,Fsize,stdin),A==B)?EOF:*A++)
#define pc(ch) (void)(FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,Fsize,stdout),Fout[(FoutSize=0)++]=ch))
int Top,FoutSize;char ch,*A,*B,Fin[Fsize],Fout[Fsize],Stack[Fsize];
public:
Class_FIO() {A=B=Fin;}
inline void read(int &x) {x=0;while(!isdigit(ch=tc()));while(x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc()));}
inline void writeln(int x) {if(!x) return pc('0'),pc('\n');while(x) Stack[++Top]=x%10+48,x/=10;while(Top) pc(Stack[Top--]);pc('\n');}
inline void clear() {fwrite(Fout,1,FoutSize,stdout),FoutSize=0;}
}F;
class Class_ChairmanTree//主席树
{
private:
#define TreeSize 100000
#define LogN 20
int tot,Root[N+5];
struct Tree
{
int Son[2],Size;
}node[N*LogN+5];
inline void ins(int l,int r,int &rt,int lst,int val)
{
if(node[rt=++tot]=node[lst],++node[rt].Size,!(l^r)) return;
register int mid=l+r>>1;
val<=mid?ins(l,mid,node[rt].Son[0],node[lst].Son[0],val):ins(mid+1,r,node[rt].Son[1],node[lst].Son[1],val);
}
inline bool qry(int l,int r,int rt1,int rt2,int ql,int qr)
{
if(ql<=l&&r<=qr) return node[rt2].Size^node[rt1].Size;
register int mid=l+r>>1;
return (ql<=mid&&qry(l,mid,node[rt1].Son[0],node[rt2].Son[0],ql,qr))||(qr>mid&&qry(mid+1,r,node[rt1].Son[1],node[rt2].Son[1],ql,qr));
}
public:
inline void Init(int len,int *data) {for(register int i=1;i<=len;++i) ins(0,TreeSize,Root[i],Root[i-1],data[i]);}//初始化
inline bool Query(int l,int r,int ql,int qr) {return Gmax(ql,0),Gmin(qr,TreeSize),ql<=qr?qry(0,TreeSize,Root[l-1],Root[r],ql,qr):false;}//询问第l~r个元素中是否有数字在[ql,qr]范围内
}ChairmanTree;
int main()
{
register int i,query_tot,x,y,l,r,L,R,t,ans;
for(F.read(n),F.read(query_tot),i=1;i<=n;++i) F.read(a[i]);
for(ChairmanTree.Init(n,a);query_tot;--query_tot)
{
for(F.read(x),F.read(y),F.read(l),F.read(r),ans=0,i=Log;~i;--i)//从高位向低位枚举
L=ans+(1<<i),R=L+(t=(1<<i)-1),ChairmanTree.Query(l,r,(((L^x)>>i)<<i)-y,(((R^x)>>i)<<i)+t-y)&&(ans|=1<<i);//判断能否选择为1
F.writeln(ans);//输出答案
}
return F.clear(),0;
}

【BZOJ4571】[SCOI2016] 美味(主席树)的更多相关文章

  1. BZOJ4571:[SCOI2016]美味(主席树,贪心)

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

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

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

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

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

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

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

  5. P3293 [SCOI2016]美味 主席树+按位贪心

    给定长度为 \(n\) 序列 \(a[i]\) ,每次询问区间 \([l,r]\) ,并给定 \(b,x\) 中的一个数 \(p=a[i]\) ,使得最大化 \(b \bigoplus p^x\) 主 ...

  6. [SCOI2016]美味——主席树+按位贪心

    原题戳这里 题解 让异或值最大显然要按位贪心,然后我们还发现加上一个\(x_i\)的效果就是所有\(a_i\)整体向右偏移了,我们对于\({a_i}\)开个主席树,支持查询一个区间中有多少个在\([L ...

  7. BZOJ4517[Scoi2016]美味——主席树

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

  8. bzoj4571/luogu3293 美味 (主席树+贪心)

    首先想到建出可持久化trie树然后在上面贪心,但是它加了一个数所以不能这么做 但依然可以贪心,仿照上面那个的过程,如果设y是在第i位上^b是1的数(前面的位数已经贪好了),我只要在[l,r]范围内能有 ...

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

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

  10. [BZOJ4571][SCOI2016]美味(贪心+主席树)

    经典问题,按位贪心,每次需要知道的是”在这一位之前的位都以确定的情况下,能否找到这一位是0/1的数”,这就是在询问[L,R]内某个值域区间是否有数,主席树即可. #include<cstdio& ...

随机推荐

  1. 基于ECharts的股票行情分时、K线、MACD、DIF、DEA图表 (绝无仅有)

    先上效果图 源码和使用说明已经开源至GitHub,欢迎各位能提出宝贵的意见噢 https://github.com/2557606319/H5-Kline

  2. tp5模型事件回调函数中不能使用$this

    tp5模型事件回调函数中不能使用$this,使用会报错,涉及到数据库操作使用Db类,不能使用$this->save()之类的方式 如果回调函数中需要使用类内函数,需要将函数定义为static,通 ...

  3. HTTP的学习记录3--HTTPS和HTTP

    一开始我所知道的只有HTTPS比HTTP更加安全,而且很多网站,如百度谷歌之流已经都是HTTPS了,博客园也是,你可以看到上方我们链接上那个绿色的小锁和绿色的安全二字. 另外吐槽一句,绿色还真是有趣, ...

  4. Java定时任务的几种实现方式

    java Timer比较具体的实现实例 https://www.cnblogs.com/0201zcr/p/4703061.html 转载大神 的 https://blog.csdn.net/kegu ...

  5. ip route,ip rule, iptables和docker的端口映射

    iptables 默认5个表, 不可增加其他表 raw 用于配置数据包,raw 中的数据包不会被系统跟踪. filter 是用于存放所有与防火墙相关操作的默认表. nat 用于 网络地址转换(例如:端 ...

  6. Unity Time.timeScale

    原创网址: http://www.xuanyusong.com/archives/2956 项目里面一直在用Time.timeScale来做游戏的 1倍 2倍整体加速,今天我仔细看了一下Time.ti ...

  7. 影子内存(Shadow RAM)介绍_4

    影子内存(Shadow RAM,或称ROM shadow)是为了提高系统效率而采用的一种专门技术.它把系统主板上的系统ROM BIOS和适配器卡上的视频ROM BIOS等拷贝到系统RAM内存中去运行, ...

  8. select 下拉框的复选

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdUAAAFSCAIAAAArbtLAAAAgAElEQVR4nOydd1gUWaK3Z2/YvXd3v7 ...

  9. Echarts同一页面多个图表自适应浏览器窗口大小——window.onresize

    当前做的一个项目中,频繁使用到百度团队的Echarts,发在一个页面同时出现多个图表时,只有最后一个图表触发了window.onresize事件,查询官方文档后得到解决. 方法如下: hwChart. ...

  10. 配置Spring发送邮件

    推荐查看原博客        转载自:配置Spring发送邮件 Spring Email抽象的核心是MailSender接口.顾名思义,MailSender的实现能够通过连接Email服务器实现邮件发 ...