一家餐廳有 n 道菜,編號 1...n ,大家對第 i 道菜的評價值為 ai(1<=i<=n)。有 m 位顧客,第 i 位顧客的期望值為 bi,而他的偏好值為 xi 。因此,第 i 位顧客認為第 j 道菜的美味度為 bi xor (aj+xi),xor 表示異或運算。
第 i 位顧客希望從這些菜中挑出他認為最美味的菜,即美味值最大的菜,但由於**等因素,他只能從第 li 道到第 ri 道中選擇。請你幫助他們找出最美味的菜。
輸入格式:
第1行,兩個整數,n,m,表示菜品數和顧客數。
第2行,n個整數,a1,a2,...,an,表示每道菜的評價值。
第3至m+2行,每行4個整數,b,x,l,r,表示該位顧客的期望值,偏好值,和可以選擇菜品區間。
輸出格式:
輸出 m 行,每行 1 個整數,ymax ,表示該位顧客選擇的最美味的菜的美味值。
輸入樣例#1:
4 41 2 3 4
1 4 1 4
2 3 2 3
3 2 3 3
4 1 2 4
輸出樣例#1:97
67對於所有測試資料,\(1<=n<=2*10^ 5,0<=ai,bi,xi<10 ^ 5,1<=li<=ri<=n(1<=i<=m),1<=m<=10^5\)
題解:如果沒有這個\(+x\)的操作,就可以直接用\(trie\)查詢最大異或值了,那麼有這個\(+x\)的操作要怎麼辦呢?
我們還是一樣的建出\(trie\)樹,然後以二進位制列舉每一位的值.
假設現在正在列舉第\(i\)位的答案\((i\in \)\),填滿第\(i\)位之前的結果為\(ans\),那麼以貪心的思想,這一位填入\(((1\ xor\ 《一定是最優的,然後填完這一位之後後面還有\(i\)個位置可以填入\(0\)或\(1\),那麼這些數字任意填入後的取值範圍就是\([0,(1<,如果在\(trie\)樹中可以找到存在值在\([ans+((1\ xor\ <>i)\&1))}《範圍內的,說明這一位可以貪心的選,否則只能在這一位填入\(((<.
#includeusing namespace std;
const int n = 2e5+5;
int n, m, a[n], cnt = 0, root[n], ans = 0, mx;
struct triet[n*20];
void update(int &x, int last, int pos, int l = 0, int r = mx)
int query(int x, int last, int ql, int qr, int l = 0, int r = mx)
int check(int x, int y, int l, int r)
int main()
cout << (ans^b) << endl;
}return 0;
}
洛谷P3293 SCOI2016 美味(主席樹)
傳送門 據說這題做法叫做可持久化trie樹?然而我並不會 首先考慮一下貪心,從高位到低位列舉,如果能選1肯定比選0優 假設已經處理到了 b 的第 i 位,為1 為0的話同理就不說了 那麼只有當 a j x 的第 i 位為0時才能讓答案的第 i 位為 1 考慮把 x 的影響去掉。如果當前的答案是 an...
P3293 SCOI2016 貪心 主席樹
題意 傳送門 p3293 scoi2016 美味 題解求某個數字 x xx 與集合中任一數字異或的最大值,考慮從高位向低位貪心的選擇與 x xx 在這一位的異或值對應的數。假設當前已處理好比第 i ii 位更高的數字,此時區間左界為 lblb lb,假如 x xx 的第 i ii 位為 1 11,那...
P3293 SCOI2016 美味 主席樹好題
題目描述 一家餐廳有 n 道菜,編號 1 n 大家對第 i 道菜的評價值為 ai 1 i n 有 m 位顧客,第 i 位顧客的期望值為 bi,而他的偏好值為 xi 因此,第 i 位顧客認為第 j 道菜的美味度為 bi xor aj xi xor 表示異或運算。第 i 位顧客希望從這些菜中挑出他認為最...