码迷,mamicode.com
首页 > 其他好文 > 详细

[BZOJ4571][Scoi2016]美味 贪心+主席树

时间:2018-01-31 11:30:21      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:表示   else   gif   data   void   open   roo   pos   mem   

4571: [Scoi2016]美味

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 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

Sample Output

9
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 }
View Code

 

[BZOJ4571][Scoi2016]美味 贪心+主席树

标签:表示   else   gif   data   void   open   roo   pos   mem   

原文地址:https://www.cnblogs.com/wls001/p/8390586.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!