Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】
联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题
题目大意:
求前\(k\)大区间异或和的和
题目思路:
真的就是个sb数据结构题,可持久化01Trie能过(开O2)。
对于区间异或和,显然可以处理成两个前缀异或和的异或和,然后做法就非常蠢,把所有前缀异或和插入到可持久化01Trie里面,然后求以每个位置为右端点的最大区间前缀和,放入大根堆维护。然后从堆中取\(k\)次最大,每次取完把对应位置的相对当前的次大插入堆中。复杂度\(O(开O2能过)\)qwq。众所周知01Trie非常短而且好写不容易错,刚写了一遍直接就过了(忽略没开O2被卡一个点的那次提交)。
当时真是蠢了,没想到用01Trie真的是sb。
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,k,rt[N],ch[N*40][2],cnt[N*40],cntnode,kth[N];
long long a[N],sum[N],ans;
struct node{
long long val;int id;
node(long long rv=0,int ri=0){
val=rv;id=ri;
}
bool operator<(const node&rhs)const{
return val<rhs.val;
}
};
priority_queue<node>pq;
void insert(int lr,int &u,long long v,int dep){
u=++cntnode;
ch[u][0]=ch[lr][0];ch[u][1]=ch[lr][1];cnt[u]=cnt[lr];
++cnt[u];
if(~dep){
int now=(v>>dep)&1;
insert(ch[lr][now],ch[u][now],v,dep-1);
}
}
long long query(int u,long long v,int rk){
long long rep=0;int now;
for(int i=31;~i;i--){
now=(v>>i)&1;
if(cnt[ch[u][now^1]]<rk){
rk-=cnt[ch[u][now^1]];
u=ch[u][now];
}
else{
rep|=(1LL<<i);
u=ch[u][now^1];
}
}
return rep;
}
int main(){
scanf("%d%d",&n,&k);
insert(0,rt[0],0,31);
for(int i=1;i<=n;i++){
kth[i]=1;
scanf("%lld",&a[i]);
sum[i]=sum[i-1]^a[i];
insert(rt[i-1],rt[i],sum[i],31);
pq.push(node(query(rt[i-1],sum[i],kth[i]),i));
}
while(k--){
node u=pq.top();pq.pop();
++kth[u.id];
ans+=u.val;
pq.push(node(query(rt[u.id-1],sum[u.id],kth[u.id]),u.id));
}
printf("%lld\n",ans);
return 0;
}
Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】的更多相关文章
- [LOJ3048] [十二省联考2019] 异或粽子
题目链接 LOJ:https://loj.ac/problem/3048 洛谷:https://www.luogu.org/problemnew/show/P5283 Solution 考虑每个子串都 ...
- 【简】题解 P5283 [十二省联考2019]异或粽子
传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...
- [十二省联考2019]异或粽子 01trie
[十二省联考2019]异或粽子 01trie 链接 luogu 思路 首先求前k大的(xo[i]^xo[j])(i<j). 考场上只想到01trie,不怎么会写可持久,就写了n个01trie,和 ...
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)
[BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如 ...
- 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解
https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...
- Luogu P5283 [十二省联考2019]异或粽子
感觉不是很难的一题,想了0.5h左右(思路歪了,不过想了一个大常数的两只\(\log\)做法233) 然后码+调了1h,除了一个SB的数组开小外基本上也没什么坑点 先讲一个先想到的方法,我们对于这种问 ...
- 【题解】Luogu P5283 [十二省联考2019]异或粽子
原题传送门 看见一段的异或和不难想到要做异或前缀和\(s\) 我们便将问题转化成:给定\(n\)个数,求异或值最靠前的\(k\)对之和 我们珂以建一个可持久化01trie,这样我们就珂以求出每个值\( ...
- P5283 [十二省联考2019]异或粽子
考场上想到了没打完,细节思路还是不是很优,我原先的想法是每一次找完后标记那个点,下次再继续找(并不是这个意思,说不清楚)但实际上和平衡树一样加个大小就很好写了 #include<bits/std ...
随机推荐
- hana-banach定理
1. x1不是X除开G以外所有的空间 2.如果极大元不是全空间的话,根据前面的讨论,还可以延拓,这就和极大矛盾了
- Django之Django终端打印SQL语句
Django之Django终端打印SQL语句 在Django项目中,settings.py文件中,在最后添加如下代码即可实现在Django终端打印SQL语句. LOGGING = { 'version ...
- Ubuntu Linux Recovery Mode
在安全模式/修復模式有以下的選項︰resume Resume normal boot繼續正常啟動作業,供不小心誤入此選單的使用者開機使用.(继续以正常模式启动) clean Try to make f ...
- Tomcat Cluster
Tomcat群集配置| Tomcat集群| MuleSofthttps://www.mulesoft.com/tcat/tomcat-cluster Tomcat Clustering - A Ste ...
- mysql问题汇总——持续更新
1.this is incompatible with sql_mode=only_full_group_by set @@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_ ...
- Oracle RMAN备份与还原注意事项
1 备份文件管理 如果要删除之前的备份,不要手动去目录下删除,应该在rman命令模式下使用删除命令,否则虽然在磁盘上把物理备份文件删除了,但是使用备份查看命令会一直看到已经删除的备份文件 list b ...
- [微软].net2.1 的兼容支持情况.
dotnet core 现在看起来 不支持xp 不支持 win10 最早版本的 和 版本. 军工客户 如果还不升级 winxp的话 可能还是没法用(客户端运行时) 不过根据前段时间安装的国产linux ...
- jq简单仿上传文件
html: <div> <input id="lefile" type="file" style="display:none&quo ...
- Java——scoket通讯
Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket是TCP/IP协议通信的抽象层,所以我们还需要了解TCP协议 传输层协议 TCP: ...
- Socket构造但不连接
Socket socket = new Socket(); SocketAddress address = new InetSocketAddress("localhost",80 ...