只考虑第一问,将珠子按照价值从小到大排序,设排序后第$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. ruby实时查看日志

    (文章是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 在调试代码的时候,把日志文件打开,边操作边调试能很快帮助我们发现系统中存在的问题. $tail r ...

  2. DrClient 校园网客户端破解

    好吧..详细点.这个功能就是破解学校的限制 让你开无线网共享给手机的时候 不会被断网 提示有代理软件..这样帮你电脑省好多流量.平板电脑也是 软件叫Process Explorer 不大 1M多 自己 ...

  3. SIFT+HOG+鲁棒统计+RANSAC

    今天的计算机视觉课老师讲了不少内容,不过都是大概讲了下,我先记录下,细讲等以后再补充. SIFT特征: 尺度不变性:用不同参数的高斯函数作用于图像(相当于对图像进行模糊,得到不同尺度的图像),用得到的 ...

  4. #ifdef 的技巧用法

    -- int _tmain(int argc, _TCHAR* argv[]) { #ifdef DEBUG cout<<"DEBUG has been defined" ...

  5. canvas API ,通俗的canvas基础知识(二)

    上文我们讲到了画一条线,画矩形,写文字,总算是有了一个好的开头,如果还没有看的同学出门左转,先看看那篇,这里就不多做叙述了,接下来我们看比较复杂的一些属性和方法! 讲之前呢,我还是想温习一下,毕竟上文 ...

  6. WebSocket技术

    webSocket技术 在html5技术革新中,加入了WebSocket技术 1.webSocket实际是TCP连接 webSocket在最初将发送http连接请求到服务器端, 但是在header中加 ...

  7. [Android Studio] 使用本地 aar 文件

    导出aar 首先Android Library项目的gradle脚本只需要在开头声明 apply plugin: 'com.android.library' 之后就和导出apk文件一样的方法,执行 . ...

  8. Maven类包冲突终极解决方案

    本文转自:http://ian.wang/106.htm 举例A依赖于B及C,而B又依赖于X.Y,而C依赖于X.M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过 ...

  9. Myeclipse中把java代码导成UML类图

    Myeclipse中把java代码导成UML类图 1.右键点击项目名称,选择New-------àUML2 Model 2.给类图命名 3.导成类图 1)如果要把整个项目导成类图,则把整个项目拖到类图 ...

  10. 安装phpredis模块

    [root@web01 src]# wget github.com/owlient/phpredis/tarball/master [root@web01 src]# tar -xzvf master ...