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. python装饰器2

    装饰模式有很多经典的使用场景,例如插入日志.性能测试.事务处理等等,有了装饰器,就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的.下面就一步步看看Python中的装饰器. 一个简单 ...

  2. Hibernate 数据库方言配置;no dialect mapping for jdbc type:-9;生僻字

    最近因为生僻字在界面上显示为?: 主要原因是该字段在数据库中就是varchar类型,显示的就是?:如䶮(yan):现把varchar类型改为nvarchar类型:数据中能够正常显示: 但是Spring ...

  3. 【Django入坑之路】Django后台上传图片,以及前端的显示

    #setting配置: MEDIA_URL = "/media/" MEDIA_ROOT = os.path.join(BASE_DIR, "media") # ...

  4. docker push dial tcp *.*.*.*:443 getsockopt: connection refused

    docker 在提交镜像的时候出现以下错误. 我用的是本地的仓库,所以tcp后面是我的ip地址. 错误信息: #docker push ubuntu docker push  dial tcp 192 ...

  5. shell学习(18)- split切分文件命令

    Linux split命令用于将一个文件分割成数个. 该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件. 语法: split [--help][--version][-& ...

  6. python MySQLdb用法,python中cursor操作数据库(转)

    数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST_NAME, LAST_N ...

  7. oracle函数 least(exp1,exp2,exp3,……,expn)

    [功能]返回表达式列表中值最小的一个.如果表达式类型不同,会隐含转换为第一个表达式类型. [参数]exp1……n,各类型表达式 [返回]exp1类型 [示例] SELECT least(10,32,' ...

  8. Twitter 宣布抛弃 Mesos,全面转向Kubernetes

    摘要: 从最早Mesos“代言人”到如今的全面转向“Kubernetes Native”,Twitter的举动再一次佐证了‘Kuberentes已经成为容器编排事实标准’这一断言. 本文作者:张磊 阿 ...

  9. hdu 1384 Intervals (差分约束)

    Problem - 1384 好歹用了一天,也算是看懂了差分约束的原理,做出第一条查分约束了. 题意是告诉你一些区间中最少有多少元素,最少需要多少个元素才能满足所有要求. 构图的方法是,(a)-> ...

  10. NodeMCU快速上云集锦

    摘要: 上至智慧园区项目,下至 `Hello world`,基于开源 MQTT 协议,阿里云 IoT 用户使用 NodeMCU 完成了不少 IoT 项目,以下为项目和教程集锦,欢迎大家一起上手试试. ...