BZOJ2006(NOI2010)[超级钢琴]--贪心+ST算法+堆
来源:互联网 发布:杀人软件 编辑:程序博客网 时间:2024/05/16 11:24
【链接】
bzoj2006
【题目大意】
给出一个序列,选出
【解题报告】
首先有个想法就是将所有子段都求出来,排序后取前
所以进一步想,我们可以从
定义三元组
假设第一大的三元组是
求
#include<cstdio>#include<cmath>#include<queue>#include<algorithm>#define LL long longusing namespace std;const int maxn=500005,maxm=20;int n,K,L,R,sum[maxn],f[maxn][maxm];LL ans;struct Data{ int x,L,R,t; Data (int a,int l,int r,int d) {x=a; L=l; R=r; t=d;} bool operator < (const Data &a) const{ return sum[x]-sum[t-1]<sum[a.x]-sum[a.t-1]; }};priority_queue<Data> hep;inline int Read(){ int res=0,f=1; char ch=getchar(),cc=ch; while (ch<'0'||ch>'9') cc=ch,ch=getchar(); if (cc=='-') f=-1; while (ch>='0'&&ch<='9') res=res*10+ch-48,ch=getchar(); return res*f;}int Min_sum(int i,int j) {if (sum[i-1]<sum[j-1]) return i; else return j;}void RMQ(){ for (int j=1,k=log2(n); j<=k; j++) for (int i=1; i<=n-(1<<j)+1; i++) f[i][j]=Min_sum(f[i][j-1],f[i+(1<<j-1)][j-1]);}int Ask(int L,int R) {int j=log2(R-L+1); return Min_sum(f[L][j],f[R-(1<<j)+1][j]);}int main(){ freopen("2006.in","r",stdin); freopen("2006.out","w",stdout); n=Read(); K=Read(); L=Read(); R=Read(); ans=sum[0]=0; for (int i=1; i<=n; i++) sum[i]=sum[i-1]+Read(),f[i][0]=i; RMQ(); while (!hep.empty()) hep.pop(); for (int i=L,l,r; i<=n; i++) l=max(i-R+1,1),r=i-L+1,hep.push(Data(i,l,r,Ask(l,r))); for (int i=1; i<=K; i++) { Data now=hep.top(); hep.pop(); ans+=sum[now.x]-sum[now.t-1]; if (now.L<now.t) hep.push(Data(now.x,now.L,now.t-1,Ask(now.L,now.t-1))); if (now.R>now.t) hep.push(Data(now.x,now.t+1,now.R,Ask(now.t+1,now.R))); } printf("%lld\n",ans); return 0;}
阅读全文
1 0
- 【贪心+ST算法+堆】BZOJ2006(NOI2010)[超级钢琴]题解
- BZOJ2006(NOI2010)[超级钢琴]--贪心+ST算法+堆
- [BZOJ2006][NOI2010]超级钢琴(st表+堆贪心)
- 【bzoj2006】[NOI2010]超级钢琴 堆+st表
- [BZOJ2006][NOI2010]超级钢琴-ST表+堆
- bzoj2006: [NOI2010]超级钢琴 贪心+堆
- NOI2010...BZOJ2006 超级钢琴 贪心
- 【贪心】BZOJ2006 [NOI2010]超级钢琴
- [贪心] BZOJ2006: [NOI2010]超级钢琴
- ST表+堆——BZOJ2006/Luogu2048 [NOI2010]超级钢琴
- bzoj2006 [NOI2010]超级钢琴 堆+ST表/主席树
- [BZOJ2006]NOI2010超级钢琴|DP|堆|RMQ
- BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】
- BZOJ2006 [NOI2010]超级钢琴
- 【bzoj2006】【NOI2010】【超级钢琴】
- [BZOJ2006][NOI2010]超级钢琴
- 【NOI2010】【BZOJ2006】超级钢琴
- [BZOJ2006] [NOI2010]超级钢琴
- 扩欧习题
- C#中static void Main(string[ ] args)中的作用及解释
- 2017.10.29
- 旋转字符串
- Qt新手常见懵逼问题
- BZOJ2006(NOI2010)[超级钢琴]--贪心+ST算法+堆
- Android应用开发结构分析
- Git系列-常见命令和用法
- 矩形滑雪场(深度搜索)
- Git系列-环境搭建
- 开发第一个SPringMVC的程序
- tensorflow实现softmax regression识别手写数字
- Python系列-比较两个数的大小
- Java高级篇-6-数组拷贝方法