十二省聯考 2019 異或粽子 tire樹 堆

2022-09-01 10:33:10 字數 2282 閱讀 5370

【題目描述】

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

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

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

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

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

【輸入格式】

從標準輸入讀入資料。

第一行兩個正整數 $n,k$,表示餡兒的數量,以及小粽打算做出的粽子的數量。

接下來一行為 $n$ 個非負整數,第 $i$ 個數為 $a_i$,表示第 $i$ 個粽子的屬性值。

【輸出格式】

輸出到標準輸出。

輸出一行乙個整數,表示小粽可以做出的粽子的美味度之和的最大值。

【樣例輸入】

3 21 2 3

【樣例輸出】

【資料範圍與提示】

|測試點|$n$|$k$|

|:-:|:-:|:-:|

|$1\sim 8$|$\le 10^$|$\le 10^$|

|$9\sim 12$|$\le 5 \times 10^$|$\le 10^$|

|$13\sim 16$|$\le 10^$|$\le 2 \times 10^$|

|$17\sim 20$|$\le 5 \times 10^$|$\le 2 \times 10^$|

對於所有的輸入資料都滿足:$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$。

首先考慮在字首異或和上暴力,$ n^2 $ 找出所有的值,放進堆裡,取前 $ k $ 大的即可,效率 $ o(n^2+\log k) $,可以過 $ 60 \% $

顯然把 $ x $ 所有能匹配的都找出來是不可能的,於是考慮在 tire 樹上貪心

建 $ n $ 棵可持久化 tire 樹,然後在 $ [0,i-1] $ 上貪心即可

考慮如何去重

於是我在測試時想到將 $ x $ 貪心對應的最大值的點 $ p $ 挖掉,然後變成兩個區間 $ [l,p-1] $ 和 $ [p+1,r] $,找對應點時建乙個鍊錶即可(類似《超級鋼琴》)

然而這樣的常數太大,於是 map tle,但還有 unorder map 嘛,跑得飛快

其實可以在 tire 樹上二分第 $ k $ 大的值,放入堆時記錄下是第 $ k $ 大的即可,為什麼我沒有想到

顯然二分是不可能去寫的

1 #include2

#define ll long long

3#define u unsigned

4 #include5

#define _(d) while(d(isdigit(ch=getchar())))

6using

namespace

std;

7ll r()

10const

int n=5e5+5;11

int n,m,rot[n],tr[n*100][2],cnt,s[n*100][2

],nex[n];

12ll a[n],sum[n],ans;

13struct

node

16 };priority_queueq;

17 tr1::unordered_mapint>mp;

18void insert(int &k,int

o,ll len,ll v)

25 ll query(int k,int

o,ll len,ll v)

32int find(ll x,int l,int

r)36

intmain()

44for(int i=1;i<=n;i++));47}

48while(m--));

52if(now.r>=id+1)q.push((node));53}

54 cout

55return0;

56 }

view code

十二省聯考 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...