只考虑第一问,将珠子按照价值从小到大排序,设排序后第$i$小的为$b[i]$,定义二元组$(x,y)$表示当前珠子的总价值为$x$,用的价值最大的珠子为$y$,用一个小根堆来维护所有状态。一开始往堆中加入$(b[1],1)$状态,然后每次取出堆顶元素$(x,y)$,可以扩展出$(x+b[y+1],y+1)$以及$(x-b[y]+b[y+1],y+1)$两个状态。如此重复,直至取满$k$个。这部分的时间复杂度为$O(k\log k)$。

对于第二问,设第一问的答案为$limit$,然后按字典序进行爆搜,假设当前可以在$[l,n]$里选一个珠子加入,那么总和不能超过$limit$,可以通过若干次在线段树上二分找到所有这样的点。因为加上这个剪枝后,只会遍历到$k$个状态,所以这部分复杂度为$O(k\log n)$。

#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
#define N 1000010
using namespace std;
typedef long long ll;
typedef pair<ll,int> P;
int n,k,i,a[N],b[N],ret,q[N],t,v[2100000];ll f[N];
priority_queue<P,vector<P>,greater<P> >Q;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
void build(int x,int a,int b){
if(a==b){v[x]=::a[a];return;}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b),v[x]=min(v[x<<1],v[x<<1|1]);
}
int ask(int x,int a,int b,int c,ll p){
if(c<=a){
if(v[x]>p)return 0;
if(a==b)return a;
}
int mid=(a+b)>>1;
if(c<=mid){
int t=ask(x<<1,a,mid,c,p);
if(t)return t;
}
return ask(x<<1|1,mid+1,b,c,p);
}
void dfs(int x,ll s){
if(!ret)return;
if(!s){
if(!(--ret))for(int i=1;i<=t;i++)printf("%d ",q[i]);
return;
}
for(;x<=n;x++){
x=ask(1,1,n,x,s);
if(!x)return;
q[++t]=x;
dfs(x+1,s-a[x]);
t--;
}
}
int main(){
read(n),read(k);k--;
if(!k)return puts("0"),0;
for(i=1;i<=n;i++)read(a[i]),b[i]=a[i];
sort(b+1,b+n+1);
Q.push(P(b[1],1));
for(i=1;i<=k;i++){
P t=Q.top();Q.pop();f[i]=t.first;
if(t.second==n)continue;
Q.push(P(t.first+b[t.second+1],t.second+1));
Q.push(P(t.first-b[t.second]+b[t.second+1],t.second+1));
}
printf("%lld\n",f[k]);
for(i=k;f[i]==f[k];i--);
ret=k-i;
build(1,1,n);
dfs(1,f[k]);
return 0;
}

  

BZOJ4345 : [POI2016]Korale的更多相关文章

  1. [bzoj4345][POI2016]Korale_堆_贪心_线段树_dfs

    bzoj4345 POI2016 Korale 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4345 数据范围:略. 题解: 由于$k$的范围问 ...

  2. 【BZOJ4345】[POI2016]Korale 堆(模拟搜索)

    [BZOJ4345][POI2016]Korale Description 有n个带标号的珠子,第i个珠子的价值为a[i].现在你可以选择若干个珠子组成项链(也可以一个都不选),项链的价值为所有珠子的 ...

  3. bzoj 4345: [POI2016]Korale

    Description 有n个带标号的珠子,第i个珠子的价值为a[i].现在你可以选择若干个珠子组成项链(也可以一个都不选),项链的价值为所有珠子的价值和.现在给所有可能的项链排序,先按权值从小到大排 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. bzoj 4347 [POI2016]Nim z utrudnieniem DP

    4347: [POI2016]Nim z utrudnieniem Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 733  Solved: 281[Su ...

  6. BZOJ4345 POI2016Korale(构造+堆+线段树)

    注意到k与n同阶,考虑构造一种枚举子集的方式,使得尽量先枚举较小的子集.首先sort一下,用堆维护待选子集.每次取出最小子集,并加入:1.将子集中最大数ai替换为ai+1 2.直接向子集中添加ai+1 ...

  7. BZOJ4348 : [POI2016]Park wodny

    首先特判全部都是A或者全部都是B或者$n=1$的情况. 然后把矩阵四周都填充上A,枚举一个块,分以下情况讨论: 1.在它四周选两个块扩展,此时平方暴力枚举即可. 2.在它四周选定一个方向扩展两步. 3 ...

  8. BZOJ4347 : [POI2016]Nim z utrudnieniem

    将石子从小到大排序,然后DP. 设$f[i][j][k]$表示考虑了前$i$堆的石子,当前扔掉的堆数模$d$为$j$,没有扔掉的石子的异或和为$k$的方案数. 因为石子排过序,所以转移的复杂度为$O( ...

  9. BZOJ4346 : [POI2016]Nadajniki

    设$f[x][j]$表示$x$点不放无线,它的儿子里放了$j$个无线,且对$x$的父亲不作要求时的最小代价. $g[x][j]$表示$x$点不放无线,要求$x$的父亲至少放$j$个无线时的最小代价. ...

随机推荐

  1. Dynamic Morphing Square(动态变形矩阵)

    题目描述: 解题思路: 先对输入的N进行判断,是否不小于3,如果小于3,需要继续输入一个新的数,知道输入的N比3大. 第一个打印的矩阵,*号为最外面一圈,其余全为-. 第二个打印的矩阵,*号向内缩减了 ...

  2. DButils实现查询和新增

             public static Adttendance DBSql(String data) throws SQLException {     String url = "j ...

  3. MySQL 索引详解大全

    什么是索引? 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2. 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结 ...

  4. XPath学习:轴(3)——descendant

    XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointe ...

  5. Find Leaves of Binary Tree

    Given a binary tree, collect a tree's nodes as if you were doing this: Collect and remove all leaves ...

  6. CSS备忘

    垂直居中:           先height再ling-height,都设成一样高 span 垂直居中:vertical-align:50%设置外边距:           margin-top,m ...

  7. C#正则表达式分组使用

    string s = "dfasfdasfdsa*fdasfdsafdsa"; s = "转发:dfasfdasfdsa*fdasfdsafdsa"; //s ...

  8. Maven打包部署脚本

    #!/bin/sh SVN_USER_NAME= SVN_PASSWORD= ROOT_PATH PROJECT_NAME ACTION SVN_LIB_ROOT USER_ACCOUNT PASSW ...

  9. laravel 分页

    因为Laravel默认使用的是en语言文件所有咱们相应使用中文分页提示的话,可以按如下步骤操作: laravel4------------------------------------------- ...

  10. Java程序员最常用的8个Java日志框架

    转自:http://www.codeceo.com/article/8-java-log-framework.html 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用 ...