1. 程式人生 > >(偽題解)洛谷P5283:[十二省聯考2019]異或粽子——題解(代碼等有學上了再補)

(偽題解)洛谷P5283:[十二省聯考2019]異或粽子——題解(代碼等有學上了再補)

.org 數量 博客 list cal mat lin math -h

https://www.luogu.org/problemnew/show/P3732

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

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

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

運算符或 Pascal 中的 xor 運算符)

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

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

不要在意我只是突然詐了一個屍。

以及場外選手題解口胡之後看了一下正解發現差不多?

正好一直想要詐一個屍,就用這個詐一個屍吧。

順(主)便(要)聊聊心路歷程。

本題解僅供參考不保證能AC

看到異或取最大第一眼想到線性基,然後看到連續的數就想到了BZOJ3261:最大異或和 。(天哪我記性真好一年前的東西我還記得)

然而此時並看不出二者的關系。

然後想暴力,枚舉$O(n^2)$,但$k$與$n$並非一個數量級的。

於是想到了BZOJ2006:[NOI2010]超級鋼琴 對前$k$大值的處理方法。(天哪我記性真好一年前的東西我還記得*2)

而超級鋼琴那道題我們是用了st表維護的,但是異或顯然不能用st表維護。

那就可持久化trie唄!順理成章的聯系到了一起。

於是題解如下:首先預處理前綴異或和$s$,建立可持久化trie,則原$[l,r]$的異或和即為$s[r] \; xor \; s[l-1]$。

於是固定$l$求$r$使得$s[r] \; xor \; s[l-1]$盡可能的最大(設為$w$吧),然後將這些信息一起扔到堆裏面(同時我們把$r$所在的範圍$L,R$一起扔裏面)。

每次彈出一個$(l,r,w,L,R)$的時候,我們就要找第二大的$[l,r]$扔進去,超級鋼琴告訴我們,第二大的$r$一定在$[L,r-1]$和$[r+1,R]$當中,我們幹脆把區間分成兩份各求一遍直接都扔進去就好了。

復雜度一個建trie$O(nloga_i)$一個預處理$O(nloga_i)$一個彈$O(kloga_i)$。

(老年選手不會算復雜度了不知道對不對orz)

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

(偽題解)洛谷P5283:[十二省聯考2019]異或粽子——題解(代碼等有學上了再補)