4571: [Scoi2016]美味
Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 751 Solved: 410
[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
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
7
6
7
HINT
Source
建立主席树。
按位贪心,由于高位确定,查询当前位为1/0的范围内是否有数。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cstdio> 5 #include<cmath> 6 #include<algorithm> 7 #define maxn 200005 8 #define ls(x) t[x].s[0] 9 #define rs(x) t[x].s[1] 10 using namespace std; 11 struct data { 12 int s[2],sz; 13 }t[maxn*20]; 14 int cnt; 15 void insert(int pre,int &now,int l,int r,int x) { 16 now=++cnt; 17 t[now]=t[pre]; 18 t[now].sz++; 19 if(l==r) return; 20 int mid=l+r>>1; 21 if(x<=mid) insert(ls(pre),ls(now),l,mid,x); 22 else insert(rs(pre),rs(now),mid+1,r,x); 23 } 24 int query(int pre,int now,int l,int r,int L,int R) { 25 if(L<=l&&R>=r) return t[now].sz-t[pre].sz; 26 int mid=l+r>>1; 27 int re=0; 28 if(L<=mid) re+=query(ls(pre),ls(now),l,mid,L,R); 29 if(R>mid) re+=query(rs(pre),rs(now),mid+1,r,L,R); 30 return re; 31 } 32 int root[maxn]; 33 int n,m; 34 int main() { 35 scanf("%d%d",&n,&m); 36 for(int i=1;i<=n;i++) {int x;scanf("%d",&x);insert(root[i-1],root[i],1,maxn,x);} 37 for(int i=1;i<=m;i++) { 38 int b,x,l,r; 39 scanf("%d%d%d%d",&b,&x,&l,&r); 40 int ans=0; 41 for(int j=17;j>=0;j--) { 42 if((b>>j)&1) { 43 int L=max(0,ans-x),R=ans+(1<<j)-1-x; 44 if(R<0||!query(root[l-1],root[r],1,maxn,L,R)) ans+=(1<<j); 45 } 46 else { 47 int L=max(0,ans+(1<<j)-x),R=ans+(1<<(j+1))-1-x; 48 if(query(root[l-1],root[r],1,maxn,L,R)) ans+=(1<<j); 49 } 50 } 51 printf("%d\n",ans^b); 52 } 53 }