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 ...
随机推荐
- $(window).scrollTop() == $(document).height() - $(window).height()(底端)
jQuery(window).height()代表了当前可见区域的大小,而jQuery(document).height()则代表了整个文档的高度,可视具体情况使用. 注意当浏览器窗口大小改变时(如最 ...
- Servlet容器container
通俗点说,所谓容器,就是放东西的地方.Servlet容器自然就是放Servlet的地方.J2EE开发,是有分工的.一般的程序员,写得都是应用开发,我们会按照一定的规则,开发我们的系统,比如用Servl ...
- 如何利用 Webshell 诊断 EDAS Serverless 应用
本文主要介绍 Serverless 应用的网络环境以及 Serverless 应用容器内的环境,了解背景知识以及基本的运维知识后可以利用 Webshell 完成基本的运维需求. Webshell 简介 ...
- django2.0基础
一.安装与项目的创建 1.安装 pip install django 2.查看版本 python -m django --version 3.创建项目 django-admin startprojec ...
- Vagrant-安装教程及常见问题
http://ju.outofmemory.cn/entry/346215 前言: Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境. 它的主要意义是让所有开发人员都使用和线上服务 ...
- Android 神兵利器之通过解析网页获取到的API数据合集,可拿来就用
AppApis 前段时间,写了个做app的实战系列教程,其中一篇章提到了解析网页中的数据为己所用,看到大家的响应还不错,于是把自己以前解析过的网页数据都整理了下,开放出来,给更多的人使用,希望可以帮助 ...
- 谷歌好样的,把 www 也干掉了
谷歌好样的,把 www 也干掉了 继把 http 干掉后,这次 Chrome 76 连 https 和 www 都一起干掉了. 喜欢简洁,但这个功能演化过程可不简单. 最早觉得把 http 干掉很不方 ...
- 2018-10-19-Roslyn-使用-Directory.Build.props-文件定义编译
title author date CreateTime categories Roslyn 使用 Directory.Build.props 文件定义编译 lindexi 2018-10-19 18 ...
- [React Native]访问操作系统剪贴板 Clipboard
我们之前学习了TextInput组件, 有时候我们需要在TextInput组件中复制或者粘贴一些文字. React Native为开发者提供了 Clipboard API,Clipboard 组件可以 ...
- ADO.NET_02
一.说明 这个例子是小白跟着学习代码记录,模拟用户登陆功能,并可以查询所有学生信息. 二.代码 共4个文件,如下 App.config <?xml version="1.0" ...