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的更多相关文章

  1. bzoj2006 [NOI2010]超级钢琴 (及其拓展)

    bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...

随机推荐

  1. MaxCompute 构建企业云数据仓库CDW的最佳实践建议

    在本文中阿里云资深产品专家云郎分享了基于阿里云 MaxCompute 构建企业云数据仓库CDW的最佳实践建议. 本文内容根据演讲视频以及PPT整理而成. 大家下午好,我是云郎,之前在甲骨文做企业架构师 ...

  2. JavaScript--放大镜

    上例图: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...

  3. Codeforces 442A

    题目链接 A. Borya and Hanabi time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. Python比较有用的小语法

    额,这是在Codeforces做题的时候从Virtual judge那儿学的 #ord()内置函数,将单个字符变为int#chr()内置函数,将int变为单个字符# for : else ( 或 wh ...

  5. 【JZOJ4791】【NOIP2016提高A组模拟9.21】矩阵

    题目描述 在麦克雷的面前出现了一个有n*m个格子的矩阵,每个格子用"."或"#"表示,"."表示这个格子可以放东西,"#" ...

  6. Android书架实现

    转自http://blog.csdn.net/wangkuifeng0118/article/details/7944215 书架效果: 下面先看一下书架的实现原理吧! 首先看一下layout下的布局 ...

  7. Apache Camel 与 Spring Boot 集成,通过FTP定时采集、处理文件 (转)

    1.概要: 本项目主要是通过在Spring平台上配置Camel.FTP,实现定时从FTP服务器下载文件到本地.解析文件.存入数据库等功能. 2.搭建空项目: Spring Boot有几种自动生成空项目 ...

  8. iOS Method Swizzling和分类的妙用AppDelegate轻量化处理

    http://www.cocoachina.com/ios/20151117/14167.html 简介 在iOS工程中,AppDelegate往往会有上千行,甚至几千行,这样就会给维护AppDele ...

  9. Python sorted

    sorted函数: iterable:是可迭代类型;cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一 ...

  10. spoj Distinct Substrings 后缀数组

    给定一个字符串,求不相同的子串的个数. 假如给字符串“ABA";排列的子串可能: A B A AB  BA ABA 共3*(3+1)/2=6种; 后缀数组表示时: A ABA BA 对于A和 ...