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 ...
随机推荐
- webpack之前端性能优化(史上最全,不断更新中。。。)
最近在用webpack优化首屏加载性能,通过几种插件之后我们上线前后的速度快了一倍,在此就简单的分享下吧,先上个优化前后首屏渲染的对比图. 可以看到总下载时间从3800ms缩短到1600ms. 我们在 ...
- git使用(上)-----基本的方法
git应该是一项必须要掌握的工具.先简述它和SVN的区别 SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活 ...
- 玩转html
简介 CSS 是什么? CSS是Cascading Style Sheets的简称,中文称为层叠样式表. 作用 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象 ...
- Mysql--单表数据记录查询
1.简单数据记录查询 1.1 简单数据查询 1.1.1 查询所有字段数据 例子: 1.1.2 "*"符号的使用 语法: 例子: 1.1.3 查询指定字段数据 例子: ...
- 【java系列】java开发环境搭建
描述 本篇文章主要讲解基于windows 10系统搭建java开发环境,主要内容包括如下: (1)安装资料准备 (2)安装过程讲解 (3)测试是否安装成功 (4)Hello Word测试 1 安装 ...
- php加密解密处理类
[PHP]代码 <?php /*=========================================================== = 版权协议: = GPL (The GN ...
- linux下php7安装memcached、redis扩展
linux下php7安装memcached.redis扩展 1.php7安装Memcached扩展 比如说我现在使用了最新的 Ubuntu 16.04,虽然内置了 PHP 7 源,但 memcache ...
- 匈牙利标记法定义ECMAScript变量前缀
匈牙利标记法定义ECMAScript变量前缀 类型 前缀 示例 数组 a aArray 布尔型 b bMale 浮点型(数字) f fTax 函数 fn fnSwap 整型(数字) i iAge ...
- Mac下CUDA开启及Tensorflow-gpu安装
本文由@ray 出品,转载请注明出处. 文章链接:http://www.cnblogs.com/wolfray/p/8040694.html 在之前的文章中,笔者介绍了在Mac下安装Tensorfl ...
- Java VS .NET:Java与.NET的特点对比
一.前言 为什么要写Java跟.NET对比? .NET出生之后就带着Java的影子.从模仿到创新,.NET平台也越来越成熟.他们不同的支持者也经常因为孰弱孰强的问题争论不休.但是本文并不是为了一分高下 ...