第K大子集-LH
题解:搜索+二分
对于每个数有选与不选两种情况。然后我们先搜前一半的状态,每个数选还是不选。
有2^17种,然后我将每种状态拍一个序先存着。然后我再搜后一半的状态,2^18种。
假设后一半某一种情况的子集和为w,我们二分的答案为t,那么我们在前一半二分找t-w。
就是前一半和后一半拼成了一个子集。如果子集全在后一半怎么办?因为前一半有个空集,
空集和后一半拼子集还是只在后一半的。
代码:没有评测的地方 我(*゜ロ゜)ノ瞎写的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 200000
#define LL long long
using namespace std; int n,an,k,bn,p,q,a[maxn];
LL l,r,mid,ans,g[maxn],f[maxn]; bool check(LL t){
int all=;
for(int i=;i<=q;i++){
LL w=t-f[i];
int c=lower_bound(g+,g+p+,w)-g;
all+=p-c+;
}
return all>=k;
} int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)scanf("%d",&a[i]),r+=a[i];
an=n/;bn=n-an;
for(int st=;st<(<<an);st++){
LL all=;
for(int i=;i<an;i++)
if((st>>i)&)all+=a[i+];
g[++p]=all;
}
for(int st=;st<(<<bn);st++){
LL all=;
for(int i=;i<bn;i++)
if((st>>i)&)all+=a[n-i];
f[++q]=all;
}
sort(g+,g+p+);sort(f+,f+q+);
while(l<=r){
mid=(l+r)>>;
if(check(mid)){
ans=mid;l=mid+;
}else r=mid-;
}
printf("%lld\n",ans);
return ;
}
第K大子集-LH的更多相关文章
- 关于“枚举{0,1,...,n-1}所包含的所有大小为k的子集”的理解
前言 今天整理以前的竞赛笔记时,发现了当时写的一个模板: 枚举{0,1,-,n-1}所包含的所有大小为k的子集: int comb = (1 << k) - 1; while (comb ...
- 快速排序 && 寻找第K大(小)的数
参考:https://minenet.me/2016/08/24/quickSort.html 快速排序 利用分治法可将快速排序的分为三步: 在数据集之中,选择一个元素作为"基准" ...
- [LeetCode] Kth Largest Element in an Array 数组中第k大的数字
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- 区间第K大(一)
Problem: 给定无序序列S:[b, e),求S中第K大的元素. Solution 1.裸排序 2.现将区间均分成两段,S1, S2,对S1,S2分别排序,然后
- 寻找数组中的第K大的元素,多种解法以及分析
遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...
- [51nod1685]第k大区间
Description 定义一个长度为奇数的区间的值为其所包含的的元素的中位数. 现给出$n$个数,求将所有长度为奇数的区间的值排序后,第$k$大的值为多少. Input 第一行两个数$n$和$k$. ...
- 数据结构2 静态区间第K大/第K小
给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个. "静态"指的是不带修改. 这个问题有多 ...
- POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)
传送门 The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8690 Acce ...
随机推荐
- SpringBoot启动流程分析(六):IoC容器依赖注入
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- hdu3579(线性同余方程组)
Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 牛人blog汇总
1.天一思维: https://blog.csdn.net/tszty1997?t=1
- 九度OJ 1202:排序 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:19711 解决:6508 题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n<=100). ...
- font awesome (图标字体库)
Font Awesome fa是什么? 图标字体库和CSS框架 怎么用? <link rel="stylesheet" href="https://cdn.boot ...
- 2017-2018-1 20179209《Linux内核原理与分析》第九周作业
理解进程调度时机 进程调度时机 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(): 内 ...
- Servlet学习笔记【1】--- 背景和基础知识(CGI、Web服务器发展史、Servlet简介、任务、继承结构)
本文主要讲Servlet的基础知识和背景知识. 1 CGI简介 CGI(Common Gateway Interface 公共网关接口)是WWW技术中最重要的技术之一,有着不可替代的重要地位.CGI是 ...
- fkwの题目(祝松松生日快乐!)
麓山国际实验学校 傅少,匡哥和巨夫出的题目(共3道) 一.题目概况 题目名称 打地铺 泡妹子 开房间 题目类型 传统 传统 传统 可执行文件名 deeeep soccer room 输入文件名 dee ...
- db2数据库还原
1.建好数据库比如TEST,建的时候将codepage设为与目标备份的codepage一致,比如: 437 2.然后备份一下刚建好的数据库,备份成功后,将20141127目录删除,然后将原来备份好的 ...
- IONIC3 打包安卓apk详细过程(大量图文)
经历三天的踩坑,跳坑,相信绝大多数的问题都已经覆盖到了,请仔细按照流程来对照操作及检查. 1.基本依赖环境 nodejs环境 (作为一个前端相信你已经有了) 最好提前配置好node的环境变量,便于全 ...