BZOJ 4571 [Scoi2016] 美味

xiaoxiao2021-02-28  98

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

按位异或+主席树~

异或各位互不影响,所以我们按照每一位来计算,从高往低,如果能让ans的该位==1就加上。这里需要我们在位置[l,r]中找到是否有数属于[L,R],我们用主席树来实现这个查找过程。

要注意的是计算数的范围[L,R]时区间可能为负,要判掉。

#include<cstdio> #include<iostream> using namespace std; int n,m,x,c[4000001],root[200001],ls[4000001],rs[4000001],ans,cnt,b,l,r,ll,rr; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();} while(ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();} return x*f; } void add(int l,int r,int las,int &now,int v) { now=++cnt;c[now]=c[las]+1; if(l==r) return; int mid=l+r>>1; ls[now]=ls[las];rs[now]=rs[las]; if(mid>=v) add(l,mid,ls[las],ls[now],v); else add(mid+1,r,rs[las],rs[now],v); } bool cal(int l,int r,int las,int now,int u,int v) { if(l>=u && r<=v) return c[now]-c[las]; int kkz=0,mid=l+r>>1; if(u<=mid) kkz+=cal(l,mid,ls[las],ls[now],u,v); if(v>mid) kkz+=cal(mid+1,r,rs[las],rs[now],u,v); return kkz; } int main() { n=read();m=read(); for(int i=1;i<=n;i++) x=read(),add(0,100000,root[i-1],root[i],x); while(m--) { b=read();x=read();l=read();r=read();ans=0; for(int i=18;~i;i--) { if((b>>i)&1) { ll=min(100000,max(ans-x,0)); rr=min(100000,ans+(1<<i)-x-1); if(rr<0 || !cal(0,100000,root[l-1],root[r],ll,rr)) ans^=(1<<i); } else { ll=min(100000,max(ans-x+(1<<i),0)); rr=min(100000,ans+(1<<i+1)-x-1); if(rr>=0 && cal(0,100000,root[l-1],root[r],ll,rr)) ans^=(1<<i); } } printf("%d\n",ans^b); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-36501.html

最新回复(0)