BZOJ5495 [2019省队联测]异或粽子
题意: 给定一个序列,问最大的k段连续异或和的代数和。 知识点: 可持久化Trie,堆 解法: 首先异或的一个性质可以把连续子串转化成前缀和的形式维护。 然后看到异或代数和最大,可以想到可持久化Trie。 但是维护的方法又有两种。 第一种也是我一开始想到的,把n个值最大的放到堆中,每次从堆中取出一个元素,更新答案;然后找出这个元素唯一对应的下一个值(暴力跳trie,最多不超过64次)。但是太难了。 第二种就是超级钢琴的做法,在l到r中找到最大的答案为pos点,然后放入l到pos-1和pos-1到r继续更新答案即可。 备注: 这种超级钢琴的做法很值得学习。注意这道题堆里面要维护的是l,r,pos,val,id,id不可以省。 代码: #include<cstdio> #include<cstring> #include<queue> using namespace std; typedef long long ll; const int maxn=500010; int n,m,tot,bit[35],rt[maxn]; ll ans,sum[maxn]; struct trie { int ch[2],tag,id; }a[maxn*40]; struct data { int l,r; ll val; int pos,id; bool operator <(const data