小粽是乙個喜歡吃粽子的好孩子。今天她在家裡自己做起了粽子。
小粽面前有 \(n\) 種互不相同的粽子餡兒,小粽將它們擺放為了一排,並從左至右編號為 \(1\) 到 \(n\)。第 \(i\) 種餡兒具有乙個非負整數的屬性值 \(a_i\)。每種餡兒的數量都足夠多,即小粽不會因為缺少原料而做不出想要的粽子。小粽準備用這些餡兒來做出 \(k\) 個粽子。
小粽的做法是:選兩個整數數 \(l,r\),滿足 \(1\le l\le r\le n\),將編號在 \([l,r]\) 範圍內的所有餡兒混合做成乙個粽子,所得的粽子的美味度為這些粽子的屬性值的異或和。(異或就是我們常說的 \(\mathrm\) 運算,即 c/c++ 中的^
運算子或 pascal 中的xor
運算子)
小粽想品嚐不同口味的粽子,因此它不希望用同樣的餡兒的集合做出乙個以上的粽子。
小粽希望她做出的所有粽子的美味度之和最大。請你幫她求出這個值吧!
分類考慮,動態用堆維護前 \(k\) 大的
顯然,題目中涉及到求 \(a_l \operatorname a_ \operatorname \cdots \operatorname a_r\) 的操作,則一定需要字首異或
設 \(s(i)=a_1 \operatorname a_2 \operatorname \cdots \operatorname a_i\),題意則轉化為求 \(s(i) \operatorname s(j)(i的前 \(k\) 大值的和。
這是乙個倒三角求值,可以補為正方形,即 \(s(i) \operatorname s(j)\) 前 \(2k\) 大值的和。
建立乙個堆,一開始把 \(\forall i \in [1,n],s(i) \operatorname s(j)(i \neq j)\) 的最大值放到堆裡。
每次取堆頂,假設為 \(s(i)\) 的 \(k\) 大值,則 pop 之後把 \(s(i)\) 的第 \(k+1\) 大值入堆。
以上操作可以通過 \(\texttt\) 完成。
#includeusing namespace std;
#define int long long
const int maxn = 500000 + 7;
int n, k;
int a[maxn], s[maxn];
int ans;
int ch[10000000][2], tot, size[10000000];
//priority_queue q;
struct node
};priority_queue q;
void init(void)
}void insert(int x)
size[p]++;
}int query(int x, int t)
return res;
}void work(void)
for(int i = 0; i <= n; i++) );
} while(k--) );
} ans >>= 1;
printf("%lld\n", ans);
}signed main(void)
十二省聯考 貳 壹玖
之前大假期集訓的時候好像做過,但是已經忘了,可能是水過去的 做之前建議先做一下noi2010超級鋼琴,跟這道題的思路是一樣的 要求的是這若干個區間貢獻的前 k 大,不妨列舉每乙個左端點,用 rmq 超級鋼琴 或者可持久化 01trie 異或粽子 維護出貢獻最大的右端點,放到乙個大根堆裡,堆裡每個元素...
十二省聯考2019 遊記
在機房呆了一天,大概看了看原先寫過的題,有點頹。下午的時候和大家一起打掃了一下機房。走的時候,看著空無一字的黑板,風吹起的棕黃色窗簾,遠方的藍色天空,有一種很濃厚的哀傷。時間過得真快啊,轉眼就是省選了呢。許是要退役了吧?許是要退役了吧。下午去試機了,感覺鍵盤不太星啊。考場倒是換了乙個地方 但是不讓我...
春節十二響 十二省聯考2019
給定一顆樹,要求將其上的節點分成若干組,使得每一組的節點互相不擁有祖先 後代關係。定義每一組的值為該組節點權值最大值,求值總和最小值。硬上不是很顯然的貪心,但是資料中鏈的情況給了提示。考慮鏈的情況 對於根節點兩側的鏈,我們分別排序,然後覆蓋選取即可。這個貪心的正確性是顯然的。現在考慮完整的資料 對於...