NOIP 模拟 $22\; \rm f$
题解 \(by\;zj\varphi\)
对于一个数,如果它二进制下第 \(i\) 位为 \(1\),那么 \(\rm x\) 在这一位选 \(1\) 的贡献就是和它不同的最高为为 \(i\) 的数的个数
这个东西很好搞,整一个 \(\rm 01trie\) 就行,每会插入的时候直接统计即可
但是如何求第 \(p\) 位,二分,但每回二分时 \(2^k\) 搜索一遍就超时了,\(\rm meet\;in\;the\;middle\)
发现每一位是相互独立的,也就是说它们之间是不会互相影响的,所以将二进制位割半,分别排个序,之后对于一个序列用指针从小往大搜,同时维护另一个指针,而这个指针一定是单调递减的;
所以复杂度就是 \(2^\frac{k}{2}log\frac{n×(n-1)}{2}\)
对于第二问,对于大的那一半开个桶,维护它能在小的那一半匹配上的数,最后按大的排序,跳区间,每次判断这个数匹配上的 \(siz\) 是否大于 \(p\),若大于就在区间内暴力,可以保证复杂度不会超过 \(2^\frac{k}{2}\)
所以总复杂度为 \(\mathcal O\rm (nk+2^\frac{k}{2}log\frac{n×(n-1)}{2}+2^\frac{k}{2})\)
Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
}
using IO::read;
namespace nanfeng{
#define pb(x) push_back(x)
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
typedef long long ll;
static const int N=5e5+7;
int a[N],tmp[N],st[N],pg[1<<16],id[1<<16],cnt1,cnt2,cnt,n,k,p,mx,hk,kh,S1,S2,bs,num,ans;
ll al,del[33];
vector<int> sg[1<<16];
struct slv{ll f;int id;}so1[1<<16],so2[1<<16];
inline int operator<(const slv &s1,const slv &s2) {return s1.f<s2.f;}
struct BIT{
#define lowbit(x) ((x)&-(x))
int c[N];
inline void update(int x) {for (ri i(x);i<=mx;i+=lowbit(i)) p(c[i]);}
inline int query(int x) {
int res(0);
for (ri i(x);i;i-=lowbit(i)) res+=c[i];
return res;
}
}B;
struct Trie{
#define sn(x,u) T[x].ch[u]
struct trie{int ch[2],sz;}T[N*30];
int tot;
Trie(){tot=1;}
inline void insert(int nw) {
int p=1;
for (ri i(29);~i;--i) {
ri cur=(nw>>i)&1;
if (!cur) del[i]-=T[sn(p,cur^1)].sz;
else del[i]+=T[sn(p,cur^1)].sz;
if (!sn(p,cur)) sn(p,cur)=p(tot);
p=sn(p,cur);
p(T[p].sz);
}
}
}T;
inline void init() {
sort(tmp+1,tmp+n+1);
int k=unique(tmp+1,tmp+n+1)-tmp;
for (ri i(1);i<=n;p(i)) st[i]=lower_bound(tmp+1,tmp+k,st[i])-tmp;
mx=k-1;
for (ri i(n);i;--i) {
al+=B.query(st[i]-1);
B.update(st[i]);
}
}
inline int check(ll f) {
ri p2=1;
num=0;
for (ri p1(cnt1);p1;--p1) {
while(p2<=cnt2&&so2[p2].f+so1[p1].f+al<=f) p(p2);
num+=p2-1;
}
return num>=p;
}
inline void checka(ll f) {
ri p1=1,tmp;
num=0;
for (ri p2(cnt2);p2;--p2) {
p(cnt);
id[pg[cnt]=cnt]=so2[p2].id;
while(p1<=cnt1&&so2[p2].f+so1[p1].f+al<f) p(p1);
tmp=0;
while(p1<=cnt1&&so2[p2].f+so1[p1].f+al==f) {
p(tmp);
sg[cnt].pb(so1[p1].id);
p(p1);
}
num+=p1-1-tmp;
}
}
inline int cmp(int x,int y) {return id[x]<id[y];}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
read(n),read(k),read(p);
for (ri i(1);i<=n;p(i)) read(a[i]),st[i]=tmp[i]=a[i];
init();
for (ri i(1);i<=n;p(i)) T.insert(a[i]);
hk=k>>1,kh=k-hk;
bs=(S1=(1<<hk)-1)+1;
S2=((1<<kh)-1)<<hk;
for (ri i(0);i<=S1;p(i)) {
ll tmp=0;
for (ri j(0);j<hk;p(j)) if ((i>>j)&1) tmp+=del[j];
so1[p(cnt1)].f=tmp;
so1[cnt1].id=i;
}
for (ri i(0);i<=S2;i+=bs) {
ll tmp=0;
for (ri j(hk);j<k;p(j)) if ((i>>j)&1) tmp+=del[j];
so2[p(cnt2)].f=tmp;
so2[cnt2].id=i;
}
sort(so1+1,so1+cnt1+1);
sort(so2+1,so2+cnt2+1);
ll l=0,r=(ll)n*(n-1)/2,res(0);
while(l<=r) {
ll mid=(l+r>>1ll);
if (check(mid)) r=mid-1,res=mid;
else l=mid+1;
}
checka(res);
sort(pg+1,pg+cnt+1,cmp);
p-=num;
for (ri i(1);i<=cnt;p(i)) {
int cur=pg[i],siz=sg[cur].size();
if (p>siz) p-=siz;
else {
sort(sg[cur].begin(),sg[cur].end());
ans=id[cur]|sg[cur][p-1];
break;
}
}
printf("%lld %d\n",res,ans);
return 0;
}
}
int main() {return nanfeng::main();}
NOIP 模拟 $22\; \rm f$的更多相关文章
- NOIP 模拟 $22\; \rm e$
题解 对于这个 \(abs\) 就是求大于 \(r\) 的最小值,小于 \(r\) 的最大值,建权值线段树或平衡树. 因为是 \(k\) 个点的联通块,就是求它们的 \(lca\) 到它们的链,可持久 ...
- NOIP 模拟 $22\; \rm d$
题解 很好的贪心题 考虑去掉的矩形一定是几个 \(a\) 最小的,几个 \(b\) 最小的,枚举去掉几个 \(a\),剩下的去掉 \(b\) 先对 \(a\) 排序,用小根堆维护 \(b\) ,记录哪 ...
- noip模拟22[d·e·f]
noip模拟22 solutions 哈哈哈,这次暴力打满直接190,其实不到哈哈哈,187.. 这次的题暴力极其好打,但是正解确实不简单... 打了好久才改完这个题,改完的时候爽暴了 这些一个字母的 ...
- 2021.5.22 noip模拟1
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
- 5.22考试总结(NOIP模拟1)
5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...
- 7.22 NOIP模拟7
又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- NOIP 模拟 $20\; \rm y$
题解 \(by\;zj\varphi\) 首先发现一共最多只有 \(2^d\) 种道路,那么可以状压,(不要 \(dfs\),会搜索过多无用的状态) 那么设 \(f_{i,j,k}\) 为走 \(i\ ...
- Shell-find . -type f -name "*.log" -print0 | xargs -0 rm -f
用 rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long.
随机推荐
- 深入浅出图神经网络 GCN代码实战
GCN代码实战 书中5.6节的GCN代码实战做的是最经典Cora数据集上的分类,恰当又不恰当的类比Cora之于GNN就相当于MNIST之于机器学习. 有关Cora的介绍网上一搜一大把我就不赘述了,这里 ...
- Python - 基本数据类型_Number 数字、bool 布尔、complex 复数
Number 数字,是一个大的分类,细分四小类 整数:int 浮点数:float 布尔:bool 复数:complex int 的栗子 print(type(-1)) print(type(1)) p ...
- 「CF1438D」 Powerful Ksenia
「CF1438D」 Powerful Ksenia 题目大意 给定 \(n\) 个正整数,你可以任选三个数 \(a_i,a_j,a_k\),使这三个数都变为 \(a_i\oplus a_j\oplus ...
- shell脚本编写规范和相关变量类型
shell编程规范与变量 一.shell脚本概述 ① 什么是shell? Linux中有哪些shell? ② shell的作用 ③ 用户的登录shell ④ shell脚本 ...
- WIN7 32运行提示无法定位api-ms-win-crt-heap-l1-1-0.dll解决方法
WIN7 32位无法运行adbapi-ms-win-crt-heap-l1-1-0.dll运行ADB ,提示无法定位api-ms-win-crt-heap-l1-1-0.dll需要安装https:// ...
- C语言枚举类型
在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等.以每周七天为例,我 ...
- CocoaPods 私有化
一.创建所需要的代码仓库 创建 Spec 私有索引库(ZFSpec),用来存放本地spec 创建模块私有库(ZFPodProject),用来存放项目工程文件 二.私有索引库添加到本地 CocoaPod ...
- python+API接口测试框架设计(unittest)
1.测试框架简介 整个接口测试框架的设计图如下: basepage:存放的是公共的方法 common:存放的是自定义工具 data:存放的是公共动态数据,如BB.xls/ Id.md log:存放的是 ...
- Python开发篇——构建虚拟Python开发环境(Conda+Poetry)
前言 之前虽略有提及Python,但是没有实际地写点料.惭愧,惭愧,所以这次先起个头,讲讲如何构建虚拟Python开发环境.相信之前看过我博客的人可能会想:博主不会又要聊聊Docker吧?放心,不会. ...
- CentOS下 Django部署 nginx+uWSGI+Django(二)
该篇内容承接CentOS下 Django部署 uWSGI+Django(一),细节流程可参考此篇内容. 1. 当前系统 CentOS Linux release 7.6.1810 Python 2.7 ...