P3293-[SCOI2016]美味【主席树】
正题
题目链接:https://www.luogu.com.cn/problem/P3293
题目大意
给出一个长度为\(n\)的序列,\(m\)次询问给出\(b,x,l,r\)表示询问在\([l,r]\)中找到一个数字\(a\)使得\(b\ xor\ (a+x)\)的值最大。
\(1\leq n,m\leq 2\times10^5,0\leq a,b,x<10^5\)
解题思路
往\(Trie\)上想就很容易卡思路,考虑正常情况下我们是怎么求\(b\ xor\ a\)最大的。
其实在\(Trie\)树上条等价于每次询问一个区间内有没有值然后再选择往左或者往右,现在这个\(x\)就是相当于把我们询问的区间移动了,既然\(Trie\)树解决不了这样的问题那么就考虑一下主席树。
定义一下\(z\)表示异或的那个数的基数(前面枚举的位已经确定),从大到小枚举\(i\),若\(b\)的第\(i\)位有那么最好是让\(a+x\)的第\(i\)位没有,也就是询问\([z-x,z-x+2^i)\)。如果第\(i\)位没有那么最好是\(a+x\)的第\(i\)位有,那么询问\([z-x+2^i,z-x+2^{i+1})\)就好了。
时间复杂度\(O(n\log^2 n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10,M=N<<5,Li=1e5;
int n,m,cnt,rt[N],w[M],ls[M],rs[M];
int Change(int x,int L,int R,int pos){
int now=++cnt;w[now]=w[x]+1;
if(L==R)return now;
int mid=(L+R)>>1;
if(pos<=mid)ls[now]=Change(ls[x],L,mid,pos),rs[now]=rs[x];
else rs[now]=Change(rs[x],mid+1,R,pos),ls[now]=ls[x];
return now;
}
int Ask(int x,int y,int L,int R,int l,int r){
if(!(w[y]-w[x]))return 0;
if(L==l&&R==r)return w[y]-w[x];
int mid=(L+R)>>1;
if(r<=mid)return Ask(ls[x],ls[y],L,mid,l,r);
if(l>mid)return Ask(rs[x],rs[y],mid+1,R,l,r);
return Ask(ls[x],ls[y],L,mid,l,mid)+Ask(rs[x],rs[y],mid+1,R,mid+1,r);
}
int Query(int L,int R,int l,int r){
if(l<0)l=0;if(r>Li)r=Li;if(r<l)return 0;
return Ask(rt[L-1],rt[R],0,Li,l,r);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
rt[i]=Change(rt[i-1],0,Li,x);
}
while(m--){
int b,a,l,r,z=0,ans=0;
scanf("%d%d%d%d",&b,&a,&l,&r);
for(int i=17;i>=0;i--){
if((b>>i)&1){
if(Query(l,r,z-a,z-a+(1<<i)-1))
ans|=(1<<i);
else z|=(1<<i);
}
else{
if(Query(l,r,z-a+(1<<i),z-a+(1<<i+1)-1))
ans|=(1<<i),z|=(1<<i);
}
}
printf("%d\n",ans);
}
return 0;
}
P3293-[SCOI2016]美味【主席树】的更多相关文章
- P3293 [SCOI2016]美味 主席树+按位贪心
给定长度为 \(n\) 序列 \(a[i]\) ,每次询问区间 \([l,r]\) ,并给定 \(b,x\) 中的一个数 \(p=a[i]\) ,使得最大化 \(b \bigoplus p^x\) 主 ...
- 【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 ...
- BZOJ.4571.[SCOI2016]美味(主席树 贪心)
题目链接 要求 \(b\ xor\ (a_j+x)\) 最大,应让 \(a_j+x\) 的最高位尽可能与b相反.带个减法Trie树好像很难做?反正我不会. 从最高位开始,如果这位b是0/1,判断是否存 ...
- [SCOI2016]美味——主席树+按位贪心
原题戳这里 题解 让异或值最大显然要按位贪心,然后我们还发现加上一个\(x_i\)的效果就是所有\(a_i\)整体向右偏移了,我们对于\({a_i}\)开个主席树,支持查询一个区间中有多少个在\([L ...
- BZOJ4517[Scoi2016]美味——主席树
题目描述 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 i 位顾客认为 ...
- BZOJ4571:[SCOI2016]美味(主席树,贪心)
Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi . 因此,第 ...
- bzoj 4571 [Scoi2016]美味——主席树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 按位考虑,需要的就是一个区间:比如最高位就是(2^k -x). 对于不是最高位的位置该 ...
- 洛谷P3293 [SCOI2016]美味(主席树)
传送门 据说这题做法叫做可持久化trie树?(然而我并不会) 首先考虑一下贪心,从高位到低位枚举,如果能选1肯定比选0优 假设已经处理到了$b$的第$i$位,为1(为0的话同理就不说了) 那么只有当$ ...
- luogu P3293 [SCOI2016]美味
题目描述 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1<=i<=n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi .因此,第 ...
随机推荐
- 从350ms到80ms,揭秘阿里工程师 iOS 短视频优化方案
内容作为 App 产品新的促活点,受到了越来越多的重视与投入,短视频则是增加用户粘性.增加用户停留时长的一把利器.短视频的内容与体验直接关系到用户是否愿意长时停留,盒马也提出全链路内容视频化的规划,以 ...
- 【spring 注解驱动开发】spring对象的生命周期
尚学堂spring 注解驱动开发学习笔记之 - 生命周期 生命周期 1.生命周期-@Bean指定初始化和销毁方法 2.生命周期-InitializingBean和DisposableBean 3.生命 ...
- uwp 之多媒体开发
xml code ----------------------------------------------------- <Page x:Class="MyApp.MainPage ...
- Spring @Order注解的使用
注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响: 1 ...
- linux下C编程初篇
对于程序设计员来说,makefile是我们绕不过去的一个坎.可能对于习惯Visual C++的用户来说,是否会编写makefile无所谓.毕竟工具本身已经帮我们做好了全部的编译流程.但是在Linux上 ...
- 关于struts中Ognl和iterator配合再次理解
Person.jsp (struts.xml中省略) package com.mzy.entity; public class Person { private String name; privat ...
- java 方法参数的执行顺序
java方法的参数的执行顺序是从左到右还是从右到左呢? 写出一下测试程序: 1 import java.util.*; 2 import java.io.*; 3 public class Test ...
- Spring笔记(1)
Spring快速入门 开发步骤 导入坐标 <dependency> <groupId>org.springframework</groupId> <artif ...
- java IO操作,看完你应该就清晰了。
前言: java中IO里的一些知识对于一个java新手来说,是比较难理解的.因为里面存在一些很绕的概念,比如: 1.到底是读入写出,还是读出写入: 2.我要将一个文件的内容拷贝到另一个文件是先用Inp ...
- Pytest 系列(28)- 参数化 parametrize + @allure.title() 动态生成标题
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 参数化 @pytest.ma ...