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 ...
随机推荐
- 基于微博LBS API开发的周边美图android app
[app 不完善,就差api了] 几年之前看到过新浪微博开放API中有基于Place的API,授权后可以查看基于地理位置的一些数据,比如某个地点周边的微博动态.某个具体用户的位置动态等等.最近空余时间 ...
- C语言之二分猜数字游戏
#include <stdio.h>#include <windows.h>#include<string.h>int main() { int oldprice, ...
- POJ3083 Children of the Candy Corn(Bfs + Dfs)
题意:给一个w*h的迷宫,其中矩阵里面 S是起点,E是终点,“#”不可走,“.”可走,而且,S.E都只会在边界并且,不会在角落,例如(0,0),输出的话,每组数据就输出三个整数,第一个整数,指的是,以 ...
- nyoj 63 小猴子下落 思维
nyoj 63 小猴子下落 题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=63 思路: 不需要用指针创建二叉树,也不需要用数组来模拟二叉 ...
- HDU 3549 Flow Problem 网络流(最大流) FF EK
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- 【机器学习】RNN学习
感谢中国人民大学的胡鹤老师,课程容量巨大,收获颇丰. 之前提到的CNN模型主要用到人类的视觉中枢,但其有一劣势,无论是人类的视觉神经还是听觉神经,所接受到的都是一个连续的序列,使用CNN相当于割裂了前 ...
- PHP之外观模式
外观(Facade)模式 当使用子系统的代码时,你也许会发现自己过于深入地调用子系统的逻辑代码.如果子系统代码总是在不断变化,而你的代码却又在许多不同地方与子系统代码交互,那么随着子系统的发展,你也许 ...
- Memory Monitor
Heap Viewer,Memory Monitor和Allocation Tracker是用来可视化你的app使用内存的补充工具. 使用Memory Monitor Tool来发现是否有不好的内存回 ...
- 学习图像算法阶段性总结 (附一键修图Demo)
今天特别感慨.自己从决定研究图像处理.势必要做出一键修图算法. 经历了,三个多月的书籍积累,三个多月的算法调整以及优化. 人是一种奇怪的动物.当你做不到的时候,你以为做到了.自己会感觉非常爽,非常有成 ...
- Error code:1728 Cannot load from mysql.proc. The table is probably corrupted
Error code:1728 Cannot load from mysql.proc. The table is probably corrupted http://bugs.mysql.com/b ...