【贪心】BZOJ2006 [NOI2010]超级钢琴
来源:互联网 发布:手抄报健康知识知多少 编辑:程序博客网 时间:2024/04/29 17:35
题面在这里
其实就是超级钢琴的出处……
考虑三元组
那么显然可以用ST算法快速求得这些区间内权值最大的区间,设其左端点为t
然后就只用考虑
这些东西都可以用堆来维护
示例程序:
#include<cstdio>#include<queue>#include<cmath>#include<algorithm>using namespace std;const int maxn=500005;int n,k,L,R,s[maxn],f[maxn][20];struct data{ int i,l,r,w; data () {} data (int _i,int _l,int _r,int _w):i(_i),l(_l),r(_r),w(_w) {} bool operator<(const data&b)const{ return w<b.w; }};priority_queue<data> Q;int RMQ(int L,int R){ int j=log2(R-L+1); return s[f[L][j]]<s[f[R-(1<<j)+1][j]]?f[L][j]:f[R-(1<<j)+1][j];}int main(){ scanf("%d%d%d%d",&n,&k,&L,&R); f[0][0]=0; for (int i=1;i<=n;i++){ int x;scanf("%d",&x); s[i]=s[i-1]+x;f[i][0]=i; } for (int j=1,tj=log2(n+1);j<=tj;j++) for (int i=0;i+(1<<j)-1<=n;i++) if (s[f[i][j-1]] < s[f[i+(1<<j-1)][j-1]]) f[i][j]=f[i][j-1];else f[i][j]=f[i+(1<<j-1)][j-1]; for (int i=1;i<=n;i++){ int l=i-R,r=i-L; if (r<0) continue;l=max(l,0); Q.push(data(i,l,r,s[i]-s[RMQ(l,r)])); } long long ans=0; while (k--){ data x=Q.top();Q.pop(); ans+=x.w;int t=RMQ(x.l,x.r); if (x.l<=t-1) Q.push(data(x.i,x.l,t-1,s[x.i]-s[RMQ(x.l,t-1)])); if (t+1<=x.r) Q.push(data(x.i,t+1,x.r,s[x.i]-s[RMQ(t+1,x.r)])); } printf("%lld",ans); return 0;}
阅读全文
2 0
- NOI2010...BZOJ2006 超级钢琴 贪心
- 【贪心】BZOJ2006 [NOI2010]超级钢琴
- [贪心] BZOJ2006: [NOI2010]超级钢琴
- bzoj2006: [NOI2010]超级钢琴 贪心+堆
- BZOJ2006 [NOI2010]超级钢琴
- 【bzoj2006】【NOI2010】【超级钢琴】
- [BZOJ2006][NOI2010]超级钢琴
- 【NOI2010】【BZOJ2006】超级钢琴
- [BZOJ2006] [NOI2010]超级钢琴
- [NOI2010/bzoj2006]超级钢琴
- BZOJ2006: [NOI2010]超级钢琴
- BZOJ2006: [NOI2010]超级钢琴
- bzoj2006: [NOI2010]超级钢琴
- [bzoj2006][NOI2010]超级钢琴
- BZOJ2006 [NOI2010]超级钢琴
- 【贪心+ST算法+堆】BZOJ2006(NOI2010)[超级钢琴]题解
- BZOJ2006(NOI2010)[超级钢琴]--贪心+ST算法+堆
- [BZOJ2006][NOI2010]超级钢琴(st表+堆贪心)
- tensorflow之安装及简单神经网络搭建
- 动态分配的内存释放之后指针要置空
- 人脸识别中的rank-n 代表的意思
- 我在学JavaScript中的循环
- 多目标优化详解
- 【贪心】BZOJ2006 [NOI2010]超级钢琴
- Centos7下Jenkins安装
- 舞蹈链模板 Dancing Links
- 面试题目:173的阶乘。 我一行代码搞定!
- Servlet生命周期与工作原理
- java读取excel表格数据,通过Ajax方式上传文件
- So Easy[Ⅰ]
- CodeForces
- 横滑