BZOJ4571:[SCOI2016]美味——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4571
https://www.luogu.org/problemnew/show/P3293
一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1<=i<=n)。有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi 。因此,第 i 位顾客认为第 j 道菜的美味度为 bi XOR (aj+xi),XOR 表示异或运算。
第 i 位顾客希望从这些菜中挑出他认为最美味的菜,即美味值最大的菜,但由于价格等因素,他只能从第 li 道到第 ri 道中选择。请你帮助他们找出最美味的菜。
打眼一看,太好了!洛谷试炼场的可持久化trie终于是一道真的可持久化trie了!
等等,怎么还能加x的,emmm……
于是将自己的板子推倒重来,我们不用以前(我写的)板子造trie,而是使用值域来造可持久化trie树。
(但其实建法都差不多……开始怀疑以前的做法是否能够搬过来。)
这样就变成了对于b的每一位(当然是贪心地从高到低),我们查找符合条件的值域-x后是否存在这一位异或后为1即可。
(反正我理解的时候都是看的代码理解的,感觉说起原理来很绕,相信大家一定能看代码理解的233)
#include<cmath> #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=2e5+5; const int mx=1e5-1; inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } struct trie{int a[2],sz; }tr[N*20]; int tot,rt[N],pool,n,m; void insert(int y,int &x,int l,int r,int k){tr[x=++pool]=tr[y];tr[x].sz++;if(l==r)return;int mid=(l+r)>>1;if(k<=mid)insert(tr[y].a[0],tr[x].a[0],l,mid,k);else insert(tr[y].a[1],tr[x].a[1],mid+1,r,k);return; } int query(int nl,int nr,int l,int r,int L,int R){if(l==L&&r==R)return tr[nr].sz-tr[nl].sz;int mid=(l+r)>>1;if(R<=mid)return query(tr[nl].a[0],tr[nr].a[0],l,mid,L,R);else if(L>mid)return query(tr[nl].a[1],tr[nr].a[1],mid+1,r,L,R);else return query(tr[nl].a[0],tr[nr].a[0],l,mid,L,mid)+query(tr[nl].a[1],tr[nr].a[1],mid+1,r,mid+1,R); } int ask(int l,int r,int k,int x){int ans=0;for(int i=18;i>=0;i--){int L,R;bool p=k&(1<<i);if(p)L=ans,R=ans+(1<<i)-1;else L=ans+(1<<i),R=ans+(1<<i+1)-1;L=max(L-x,0),R=min(R-x,mx);if(L<=R&&query(rt[l-1],rt[r],0,mx,L,R))ans+=(1<<i)*(p^1);else ans+=(1<<i)*p;}return ans^k; } int main(){n=read(),m=read();for(int i=1;i<=n;i++){insert(rt[i-1],rt[i],0,mx,read());}for(int i=1;i<=m;i++){int k=read(),x=read(),l=read(),r=read();printf("%d\n",ask(l,r,k,x));}return 0; }
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
转载于:https://www.cnblogs.com/luyouqi233/p/8966237.html
BZOJ4571:[SCOI2016]美味——题解相关推荐
- 洛谷·[SCOI2016]美味
初见安~这里是传送门:洛谷P3293 [SCOI2016]美味 题解 首先看到有两层限制:区间[l, r]以及要异或值最大.很显然把区间限制转化到时间限制,建可持久化数据结构. 每道菜对不同的人有不同 ...
- bzoj [Scoi2016]美味
[Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 721 Solved: 391 [Submit][Status][Disc ...
- P3293 [SCOI2016]美味
P3293 [SCOI2016]美味 题意: 有n个数组a,现在有m个询问,每次给出一个b和x,问b xor (a[i] + x)的最大值是多少? 题解: 不难看出01Trie的题目 我们设ans=a ...
- [BZOJ 4571][Scoi2016]美味(主席树)
Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 ...
- trie树上值域化建主席树 查询异或平移最小值 ---- P3293 [SCOI2016]美味
题目大意: 解题思路: 首先我们知道区间查询异或最小值肯定是在trie是匹配 而且如果没有(aj+xi)(aj+xi)(aj+xi)就是一个可持久化Trie树上面的裸题了 但是很不幸有 怎么办呢? 首 ...
- luogu P3293 [SCOI2016]美味
传送门 异或最大值应该是要用\(trie\)树,从高位往低位贪心,虽然这里询问区间的数都要加上\(x\),但是仍然可以利用这个思想 从高往低位考虑,我们要找一个加上\(x\)后当前二进制位\(j\)不 ...
- P3293 [SCOI2016]美味 主席树 + 伪01trie
传送门 文章目录 题意: 思路: 题意: 思路: 看到异或的话,很容易想到用01trie来贪心的搞,但是这个题涉及区间问题,直接搞的话需要将[l,r][l,r][l,r]的数都插入trie里面,这样的 ...
- 一句话题解(20180210~)
2.9 BZOJ 2006 [NOI2010]超级钢琴.这道题目几天之前就做了.做法是固定右端点,左端点在ST表上走,走法其实就是笛卡尔树的走法.完结撒花! BZOJ 1218 [HNOI2003]激 ...
- 【bzoj4571SCOI2016美味】
4571: [Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 656 Solved: 350 [Submit][Status ...
最新文章
- loadruner中加中Java_Script
- 网站性能分析(下)-让网站并行加载但顺序执行JS
- Lazy WriterCheckPoint
- android studio常用适配器,从ListView(Android Studio)的自定义适配器中的U...
- Unicode utf8等编码类型的原理
- 同步和异步GET,POST请求
- IBM服务器win7系统忘记密码,图文详解Win7系统忘记开机密码的处理方法
- vijos 1198 最佳课题选择
- Kylin启动异常:java.lang.outofMemoryError:Requested array size exceeds VM limit
- RedHat Linux 9.0 操作系统测试题2
- xshell连接及优化
- 基于Windows AD的单点登录系统
- 游戏修改服务器数据,修改游戏服务器数据的教程
- 毁灭程序员效率的 15 个障碍
- Java实现微信聊天记录生成器
- metasploit的SET的Credential Harvester Attack Method
- Python 技术篇 - whl库安装,有没有amd64结尾的区别
- Python Excel插入图片
- 台式机计算机上的无线开关,菜鸟教程:遥控电脑让PC实现无线开关机
- 三星用什么软件测试硬件,3个版本的三星S10软硬件大比拼,你最中意哪个