【題目描述】
小粽是乙個喜歡吃粽子的好孩子。今天她在家裡自己做起了粽子。
小粽面前有 $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 #include2view code#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 }
十二省聯考 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...