CF241B Friends
和Tree and Xor思路一样CF1055F Tree and XOR
直接找到第k大val,可以直接建出trie,然后按位贪心
考虑比val大的数的和
还是用b[i]维护可能和i贡献的trie的位置
当val这一位是0时候,v[i]就可以和ch[b[i]][v[i]>>d&1^1]进行贡献
一个点与一个子树进行贡献,不容易做。
不妨把v进行sort,子树就是区间了!
直接枚举每一位进行xor贡献
O(nlog^2n)
注意,
题目要求(a,b)不等于(b,a)方便起见,k*=2,最后ans/=2
可以最后再取mod
第k大的贡献不会算上,额外考虑,但是注意只是剩下一些个第k大元素。
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=;
const int mod=1e9+;
int v[N],a[N],b[N];
int n;
ll k,val;
int ch[N*+][],tot,l[N*+],r[N*+];
int rt;
int sz[N*+];
int pre[N][][];
ll ans;
void ins(int v,int id){
if(!rt) rt=++tot,l[rt]=,r[rt]=n;
int x=rt;
++sz[rt];
for(reg d=;d>=;--d){
int c=(v>>d)&;
if(!ch[x][c]) ch[x][c]=++tot,l[tot]=id;
x=ch[x][c];
r[x]=id;
++sz[x];
}
}
void fin(){
for(reg i=;i<=n;++i) b[i]=rt;
for(reg d=;d>=;--d){
ll s=,t=;
for(reg i=;i<=n;++i){
s+=sz[ch[b[i]][(v[i]>>d&)^]];
}
if(s<k) k-=s,t=;
else t=,val|=(<<d);
for(reg i=;i<=n;++i){
b[i]=ch[b[i]][(v[i]>>d&)^t];
}
}
} ll con(int l,int r,ll v){
if(!l||!r) return ;
--l;
// cout<<" con "<<l<<" "<<r<<" v "<<v<<endl;
ll ret=;
for(reg d=;d>=;--d){
int c=v>>d&;
ret=ret+(ll)(pre[r][d][c^]-pre[l][d][c^])*(1LL<<d);
}
return ret;
}
void calc(){
for(reg i=;i<=n;++i) b[i]=rt;
for(reg d=;d>=;--d){
int t=val>>d&;
// cout<<" dd "<<d<<" tt "<<t<<endl;
if(!t){
for(reg i=;i<=n;++i){
int c=v[i]>>d&;
ans+=con(l[ch[b[i]][c^]],r[ch[b[i]][c^]],v[i]);
}
}
for(reg i=;i<=n;++i){
b[i]=ch[b[i]][(v[i]>>d&)^t];
}
}
}
int main(){
rd(n);rd(k);
if(k==){
puts("");return ;
}
k=k*; for(reg i=;i<=n;++i){
rd(v[i]);//++mp[v[i]];
}
sort(v+,v+n+);
for(reg i=;i<=n;++i) ins(v[i],i);
// cout<<" kk "<<k<<endl;
fin();
ans+=k*val;
for(reg i=;i<=n;++i){
for(reg d=;d>=;--d){
pre[i][d][]=pre[i-][d][];
pre[i][d][]=pre[i-][d][];
pre[i][d][(v[i]>>d)&]++;
}
}
// cout<<" ans1 "<<ans<<endl;
calc();
ans/=;
ot(ans%mod);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
CF241B Friends的更多相关文章
- bzoj2006 [NOI2010]超级钢琴 (及其拓展)
bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...
随机推荐
- 阿里云王广芳:5G时代,我们需要怎样的边缘计算?
7月24日阿里云峰会开发者大会的IT基础设施云化专场中,阿里云边缘计算高级技术专家王广芳进行了边缘节点服务重大升级发布,同时与现场观众一同探讨了5G时代边缘计算的思考与技术实践. 5G时代,我们需要怎 ...
- 两种方法使vue实现jQuery调用
引言 如果说vue是前端工程化使用较多的骨架,那么JavaScript就是我们的前端的细胞.MVVM模式让我们体验到前端开发的便携,无需再过多的考虑DOM的操作.而vue的渐进式开发(逐步引用组件,按 ...
- kubernetes1.4新特性:支持两种新的卷插件
背景介绍 在Kubernetes中卷的作用在于提供给POD持久化存储,这些持久化存储可以挂载到POD中的容器上,进而给容器提供持久化存储. 从图中可以看到结构体PodSpec有个属性是Volumes, ...
- Jeff Dean 光辉事迹
这是Google 2007年的愚人节笑话,罗列了很多Jeff Dean的“光辉事迹”.大名鼎鼎的Jeff Dean想必不用我介绍了.……好吧,还是介绍一下,Jeff Dean是Google最早的一批员 ...
- docker 与host互传文件
docker 的cp命令可以从容器往外复制,也可以从本机复制的容器. docker cp 文件路径 容器id:/容器目录 docker help cp Usage: docker cp [OPT ...
- map的三种遍历方法!
map的三种遍历方法! 集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ /* * To change this template, choose Tools | Te ...
- 通过iOS 9 SFSafariViewController提供完整的Web浏览体验
http://www.cocoachina.com/ios/20150826/13157.html 本文由CocoaChina译者@涛声依旧-忆往昔翻译自tutsplus校对:BenBeng原文:iO ...
- 2019-4-7-VisualStudio-解决方案筛选器-slnf-文件
title author date CreateTime categories VisualStudio 解决方案筛选器 slnf 文件 lindexi 2019-04-07 11:34:59 +08 ...
- 2019-7-25-VisualStudio-2019-新创建项目添加-git-仓库
title author date CreateTime categories VisualStudio 2019 新创建项目添加 git 仓库 lindexi 2019-7-25 15:8:15 + ...
- window执行python文件
@echo offD:cd D:\pythonstart python2 del.pyexit