[SCOI2016]美味
问题描述
一家餐厅有 n 道菜,编号 1…n ,大家对第 i 道菜的评价值为$ a_i(1≤i≤n)$。有 m 位顾客,第 i 位顾客的期望值为 $b_i$,而他的偏好值为 $x_i$ 。因此,第 i 位顾客认为第 j 道菜的美味度为 $b_i\ XOR\ (a_j+x_i)$,XOR 表示异或运算。第 i 位顾客希望从这些菜中挑出他认为最美味的菜,即美味值最大的菜,但由于价格等因素,他只能从第 $l_i$ 道到第 $r_i$ 道中选择。请你帮助他们找出最美味的菜。
输入格式
第1行,两个整数,n,m,表示菜品数和顾客数。
第2行,n个整数,$a_1,a_2,…,a_n,$表示每道菜的评价值。
第3至m+2行,每行4个整数,b,x,l,r,表示该位顾客的期望值,偏好值,和可以选择菜品区间。
输出格式
输出m 行,每行一个整数表示该位顾客选择的最美味的菜的美味值。
样例输入
4 4
1 2 3 4
1 4 1 4
2 3 2 3
3 2 3 3
4 1 2 4
样例输出
9
7
6
7
提示
$1≤n≤2×10^5,$
$0≤a_i,b_i,x_i<10^5,$
$1≤l_i≤r_i≤n(1≤i≤m),$
$1≤m≤10^5$
令$Ans=b_i\ XOR\ (a_j+x_i)$,那么$Ans\ XOR\ b_i=a_j+x_i$,我们考虑按照二进制位贪心,那么如果当前讨论到从高到低的第$k$位,考虑$Ans$这一位能否取1,那么由于第$k$位以前的二进制位已经确定,我们令$Ans$的前$k$位和$b$的前$k$位异或的结果为$tmp$,其余未确定的位都取0,如果$b$的二进制第$k$位为$1$,那么$Ans$的第$k$位要为1,就有$Ans\ XOR\ b$的第$k$位要为0,只需要存在一个$a_j+x_i$在$[tmp,tmp|((1<<(Max-k))-1)]$之间就行了,$tmp|((1<<(Max-k))-1)$表示未确定的位(除第$k$位)均取1,这个查询可以用主席树来搞。
如果$b$的二进制第$k$位为0,那么$Ans\ XOR\ b$的第$k$位为1,同样只需要用主席树查找一下就行了。具体可以看代码。核心就是按位贪心看能否取到。
代码:
1 |
|