只考虑第一问,将珠子按照价值从小到大排序,设排序后第$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)$。

  1. #include<cstdio>
  2. #include<queue>
  3. #include<vector>
  4. #include<algorithm>
  5. #define N 1000010
  6. using namespace std;
  7. typedef long long ll;
  8. typedef pair<ll,int> P;
  9. int n,k,i,a[N],b[N],ret,q[N],t,v[2100000];ll f[N];
  10. priority_queue<P,vector<P>,greater<P> >Q;
  11. 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';}
  12. void build(int x,int a,int b){
  13. if(a==b){v[x]=::a[a];return;}
  14. int mid=(a+b)>>1;
  15. build(x<<1,a,mid),build(x<<1|1,mid+1,b),v[x]=min(v[x<<1],v[x<<1|1]);
  16. }
  17. int ask(int x,int a,int b,int c,ll p){
  18. if(c<=a){
  19. if(v[x]>p)return 0;
  20. if(a==b)return a;
  21. }
  22. int mid=(a+b)>>1;
  23. if(c<=mid){
  24. int t=ask(x<<1,a,mid,c,p);
  25. if(t)return t;
  26. }
  27. return ask(x<<1|1,mid+1,b,c,p);
  28. }
  29. void dfs(int x,ll s){
  30. if(!ret)return;
  31. if(!s){
  32. if(!(--ret))for(int i=1;i<=t;i++)printf("%d ",q[i]);
  33. return;
  34. }
  35. for(;x<=n;x++){
  36. x=ask(1,1,n,x,s);
  37. if(!x)return;
  38. q[++t]=x;
  39. dfs(x+1,s-a[x]);
  40. t--;
  41. }
  42. }
  43. int main(){
  44. read(n),read(k);k--;
  45. if(!k)return puts("0"),0;
  46. for(i=1;i<=n;i++)read(a[i]),b[i]=a[i];
  47. sort(b+1,b+n+1);
  48. Q.push(P(b[1],1));
  49. for(i=1;i<=k;i++){
  50. P t=Q.top();Q.pop();f[i]=t.first;
  51. if(t.second==n)continue;
  52. Q.push(P(t.first+b[t.second+1],t.second+1));
  53. Q.push(P(t.first-b[t.second]+b[t.second+1],t.second+1));
  54. }
  55. printf("%lld\n",f[k]);
  56. for(i=k;f[i]==f[k];i--);
  57. ret=k-i;
  58. build(1,1,n);
  59. dfs(1,f[k]);
  60. return 0;
  61. }

  

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. ReactiveCocoa入门教程:第一部分

    http://www.cocoachina.com/ios/20150123/10994.html 本文翻译自RayWenderlich,原文:ReactiveCocoa Tutorial--The ...

  2. 向着目标杀jj

     海外资深实力公司招聘:1.PHP工程师,18-25K2.UI设计师,15-25K3.前端工程师,18-25K4.Python工程师,18-25K5.DBA工程师,18-25K6.服务端工程师,18- ...

  3. c++ exports def文件

    https://msdn.microsoft.com/zh-cn/library/hyx1zcd3(v=vs.80).aspx EXPORTS 引入了一个由一个或多个 definitions(导出的函 ...

  4. poj3259 bellman——ford Wormholes解绝负权问题

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 35103   Accepted: 12805 Descr ...

  5. HDOJ 1102 生成树

    Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. MySQL5.5 RPM安装的默认安装路径

    MySQL5.5 RPM安装的默认安装路径 2011-06-20 10:34:32|  分类: MySQL|举报|字号 订阅   下载LOFTER客户端     由于一客户要求安装mysql- 5.5 ...

  7. Minimum Path Sum

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  8. Two Sum I & II

    Two Sum I Given an array of integers, find two numbers such that they add up to a specific target nu ...

  9. SPI通信实验---verilog(FPGA作为从机,使用可读可写)

    本实验讲究实用性,故设计思想为:主机先向从机发送地址,若是向从机写入数据,则向从机发送数据,若是读取从机数据,则向从机发送时钟,然后在时钟下降沿读取数据即可.cs信号上升沿作为SPI通信的结束信号.r ...

  10. 干货分享:IBM StorwizeV7000部署与运维

    http://storage.it168.com/a2014/1211/1689/000001689526_3.shtml