bzoj 4345: [POI2016]Korale
Description
Input
Output
Sample Input
3 7 4 3
Sample Output
1 3 4
HINT
Source
用堆来求k优解是一个很常用的方法了,我们先排序,堆中存入二元组(sum,i),表示和为sum,最大的元素的编号为i,
那么每次取出(sum,i),把(sum+a[i+1],i+1)和(sum-a[i]+a[i+1],i+1)丢入堆中即可;
然后我们考虑如何求出字典序,考虑用dfs来实现,假设dfs传的参为(x,sum),那么我们每次都是从(x+1,n)中最小的满足a[i]<=sum的i开始搜索,这样就不用枚举x+1-n了;
这样满足dfs求字典序的搜索顺序;因为我们只会搜索到k个,所以复杂度是对的;上面那个问题我们可以在线段树上进行查询;
线段树上维护区间最小值,然后在线段树上二分即可;
//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define lson x<<1
#define rson x<<1|1
using namespace std;
typedef long long ll;
const int N=1000050;
int n,k;
ll ans[N],a[N],b[N],tr[N*4],Mn[N*4];
struct data{
ll sum;int j;
};
bool operator < (const data &a,const data &b){
return a.sum>b.sum;
}
priority_queue<data> Q;
int zhan[N],tot,tt,K;
void build(int x,int l,int r){
if(l==r) {tr[x]=l,Mn[x]=b[l];return;}
int mid=(l+r)>>1;
build(lson,l,mid);build(rson,mid+1,r);
if(tr[lson]) tr[x]=tr[lson];
if(tr[rson]) tr[x]=min(tr[x],tr[rson]);
Mn[x]=min(Mn[lson],Mn[rson]);
}
int query(int x,int l,int r,int xl,int xr,ll v){
if(l==r){
if(Mn[x]<=v) return l;
else return n+1;
}
if(xl<=l&&r<=xr){
int mid=(l+r)>>1;
if(Mn[x]>v) return n+1;
else if(Mn[lson]<=v) return query(lson,l,mid,xl,mid,v);
else return query(rson,mid+1,r,mid+1,xr,v);
}
int mid=(l+r)>>1;
if(xr<=mid) return query(lson,l,mid,xl,xr,v);
else if(xl>mid) return query(rson,mid+1,r,xl,xr,v);
else return min(query(lson,l,mid,xl,mid,v),query(rson,mid+1,r,mid+1,xr,v));
}
void dfs(int x,ll sum){
if(K>=tt) return;
if(!sum){
K++;
if(K==tt) for(int i=1;i<=tot;i++) printf("%d ",zhan[i]);
return;
}
if(x==n) return;
for(int i=x+1;i<=n;i++){
i=query(1,1,n,i,n,sum);
if(i<=n){
zhan[++tot]=i;dfs(i,sum-b[i]);tot--;
}
else return;
}
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]),b[i]=a[i];
sort(a+1,a+1+n);Q.push((data){a[1],1});k--;
for(int i=1;i<=k;i++){
data x=Q.top();Q.pop();ans[i]=x.sum;
if(x.j+1<=n) Q.push((data){x.sum+a[x.j+1],x.j+1});
if(x.j+1<=n) Q.push((data){x.sum-a[x.j]+a[x.j+1],x.j+1});
}
while(ans[k]==ans[k-(tt+1)+1]) tt++;
printf("%lld\n",ans[k]);build(1,1,n);
dfs(0,ans[k]);
return 0;
}
bzoj 4345: [POI2016]Korale的更多相关文章
- 【BZOJ4345】[POI2016]Korale 堆(模拟搜索)
[BZOJ4345][POI2016]Korale Description 有n个带标号的珠子,第i个珠子的价值为a[i].现在你可以选择若干个珠子组成项链(也可以一个都不选),项链的价值为所有珠子的 ...
- bzoj 4347 [POI2016]Nim z utrudnieniem DP
4347: [POI2016]Nim z utrudnieniem Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 733 Solved: 281[Su ...
- BZOJ4345 : [POI2016]Korale
只考虑第一问,将珠子按照价值从小到大排序,设排序后第$i$小的为$b[i]$,定义二元组$(x,y)$表示当前珠子的总价值为$x$,用的价值最大的珠子为$y$,用一个小根堆来维护所有状态.一开始往堆中 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [bzoj4345][POI2016]Korale_堆_贪心_线段树_dfs
bzoj4345 POI2016 Korale 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4345 数据范围:略. 题解: 由于$k$的范围问 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
随机推荐
- 【笔记】web 的回流与重绘及优化
最近看了幕课网 web 前端性能优化的课程,其中说到了浏览器的回流(reflow) 及 重绘(repaint).觉得以后面试或许会被问到所以做一下笔记: 课程从回流及重绘这两个点延伸出了一个知识点就是 ...
- Winform 中 dataGridView 导出到Excel中的方法总结
最近,在做CS端数据导出到Excel中时网上找了很多代码感觉都不是自己想要的,通过自己的整理归纳得到一个比较通用的方法,就给大家分享一下: 该方法需要用到两个参数(即对象),一个 DataGridV ...
- C++反汇编第一讲,认识构造函数,析构函数,以及成员函数
C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...
- accept 文件描述符用尽处理
if (events[i].data.fd == listenfd) { peerlen = sizeof(peeraddr); connfd = ::accept4(listenfd, (struc ...
- 前端测试框架Jest系列教程 -- 简介
写在前面: 随着互联网日新月异的发展,用户对于页面的美观度,流畅度以及各方面的体验有了更高的要求,我们的网页不再是简单的承载文字,图片等简单的信息传递给用户,我们需要的是更加美观的页面展示,更快的浏览 ...
- hibernate log4j
log4j.rootLogger=warn, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender. ...
- js+画曲线和圆 并限制圆的渲染范围
通过三个点的坐标可确定一条双曲线. 公式: 1)y=ax^2+bx+c; 2) y=a(x-k)+h; 通过已知三点可确定a,b,c,h,k 2.通过圆心坐标(a,b)和半径r可确定一个圆,和已知的x ...
- Android数据绑定技术一,企业级开发
PS:数据绑定,顾名思义是数据与一些控件或者用户账号等绑定,这样用的好处是便于管理.代码清晰,量少. 首先要了解什么是数据绑定? 为什么要用数据绑定? 怎么用数据绑定? 语法的使用 简单例子,数据绑定 ...
- Python爬虫学习之使用beautifulsoup爬取招聘网站信息
菜鸟一只,也是在尝试并学习和摸索爬虫相关知识. 1.首先分析要爬取页面结构.可以看到一列搜索的结果,现在需要得到每一个链接,然后才能爬取对应页面. 关键代码思路如下: html = getHtml(& ...
- logstash 向elasticsearch写入数据,怎样指定多个数据template
之前在配置从logstash写数据到elasticsearch时,指定单个数据模板没有问题.可是在配置多个数据模板时候,总是不成功,后来找了非常多资料,最终找到解决的方法,就是要多加一个配置项: te ...