4349 十二省聯考 2019 異或粽子

2022-09-01 05:03:07 字數 1417 閱讀 6922

題意

記憶體限制:1024 mib

時間限制:1500 ms

小粽是乙個喜歡吃粽子的好孩子。今天她在家裡自己做起了粽子。

小粽面前有 $n$ 種互不相同的粽子餡兒,小粽將它們擺放為了一排,並從左至右編號為 $1$ 到 $n$。第 $i$ 種餡兒具有乙個非負整數的屬性值 $a_i$。每種餡兒的數量都足夠多,即小粽不會因為缺少原料而做不出想要的粽子。小粽準備用這些餡兒來做出 $k$ 個粽子。

小粽的做法是:選兩個整數數 $l,r$,滿足 $1\le l\le r\le n$,將編號在 $[l,r]$ 範圍內的所有餡兒混合做成乙個粽子,所得的粽子的美味度為這些粽子的屬性值的**異或**和。(異或就是我們常說的 $\mathrm$ 運算,即 c/c++ 中的 `^` 運算子或 pascal 中的 `xor` 運算子)

小粽想品嚐不同口味的粽子,因此它不希望用同樣的餡兒的集合做出乙個以上的粽子。

小粽希望她做出的所有粽子的美味度之和最大。請你幫她求出這個值吧!

$1\le n \le 5 \times 10^,1\le k\le \min\left\,2 \times 10^\right\},0\le a_i \le 4,294,967,295$

題解

把 $a_i$ 變成字首異或和,所以實際上是在 $[0,n]$ 中選 $k$ 對 $(x,y)$ 使 $\sum a_x \oplus a_y$ 最大

考慮到 $k$ 不是很大,我們可以建立堆,一開始把每個數選到最大的數丟到堆中,然後以異或值作為關鍵字排序,每次取出堆頂,然後找其第二大異或值丟到堆中……

所以可以發現我們需要查詢對於 $i$ , $j \in [0,i-1]$ 的 $a_i \oplus a_j$ 第 $k$ 大數是多少

所以可以建立可持久化 $trie$ 樹,在 $trie$ 樹上進行二分即可

**

#include #define i inline

#define ll long long

using

namespace

std;

const

int n=5e5+5

;int

n,k,t[n],tt;ll a[n],ans;

struct ot[n<<6

];struct

q};priority_queue

q;i

void ins(int& x,ll v,int

d)i ll query(

int x,ll y,int k,int

d)int

main());

for (int i=1;i<=k;i++));

}return printf("

%lld\n

",ans),0

;}

十二省聯考 2019 異或粽子

題目鏈結 演算法 首先把字首異或和統計出來,再將得到的每乙個字首異或和 包括pre 0 0 塞進字典樹中,接下來有乙個貪心的思路 每當我拿著其中乙個異或和的值時,我在字典樹中盡可能找二進位制高位與其對應的位不相同的異或和,這樣兩者異或運算後,所得值最大。所以我們有了這樣乙個思路,對於每乙個pre i...

十二省聯考2019 異或粽子

點此看題 方法1 發現這道題k kk很小,先考慮用字首和表示異或和,建出一顆tire text tire 樹,然後把每個點的最優值丟進優先佇列中 因為其他值沒有這個值優 然後依次取出,再把次大值塞進去。由於每個區間會被統計兩次,所以我們找2k2k 2k次,最後把答案除以2 22即可。方法2 和k k...

十二省聯考2019 異或粽子

其實和超級鋼琴那個題思路挺像的,就是我們弄乙個二元組,乙個pos,乙個sum。求一下字首異或和,然後在它pos前面的01trie裡面查詢第k大即可。如下 luogu judger enable o2 include include include include include include de...