NOI2010 : 超级钢琴
求出前缀和
对于每个结尾i,设现在取的区间是[j+1,i],则i-R<=j<=i-L,取出该区间sum[j]的最小值,将sum[i]-sum[j]放入堆中
建立一个大根堆,每次取出堆顶元素,将排名k+1,将sum[i]-区间第k小值放入堆中
求区间第k小可以用主席树
直到取满K次为止
- #include<cstdio>
- #include<algorithm>
- #include<queue>
- #define N 500010
- #define M 10000000
- using namespace std;
- int n,i,j,K,L,R,sum[N],b[N],l[M],r[M],val[M],root[N],tot;long long ans;
- inline void read(int&a){
- char c;bool f=0;a=0;
- while(!((((c=getchar())>='0')&&(c<='9'))||(c=='-')));
- if(c!='-')a=c-'0';else f=1;
- while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';
- if(f)a=-a;
- }
- inline int lower(int x){
- int l=1,r=n,mid,t;
- while(l<=r)if(b[mid=(l+r)>>1]<x)l=mid+1;else r=(t=mid)-1;
- return t;
- }
- int ins(int x,int a,int b,int c){
- int y=++tot;
- val[y]=val[x]+1;
- if(a==b)return y;
- int mid=(a+b)>>1;
- if(c<=mid)l[y]=ins(l[x],a,mid,c),r[y]=r[x];else l[y]=l[x],r[y]=ins(r[x],mid+1,b,c);
- return y;
- }
- inline int kth(int x,int y,int k){
- if(val[y]-val[x]<k)return 0;
- int a=1,b=n,mid,t;
- while(1){
- if(a==b)return a;
- t=val[l[y]]-val[l[x]];mid=(a+b)>>1;
- if(k<=t)b=mid,x=l[x],y=l[y];else a=mid+1,k-=t,x=r[x],y=r[y];
- }
- }
- struct node{
- int x,l,r,k,i;
- node(){}
- node(int _i,int _l,int _r,int _k){i=_i;l=_l;r=_r;k=_k;x=sum[i]-b[kth(root[l],root[r],k)];}
- node(int _i,int _k){i=_i;l=max(i-R-1,0);r=max(i-L,0);k=_k;x=sum[i]-b[kth(root[l],root[r],k)];}
- bool operator<(const node&b)const{return x<b.x;}
- }tmp;
- priority_queue<node>H;
- int main(){
- for(read(n),read(K),read(L),read(R),n++,i=2;i<=n;i++)read(j),sum[i]=sum[i-1]+j;
- for(b[0]=600000000,i=1;i<=n;i++)b[i]=sum[i];
- for(sort(b+1,b+n+1),i=1;i<=n;i++)root[i]=ins(root[i-1],1,n,lower(sum[i]));
- for(i=2;i<=n;i++)H.push(node(i,1));
- while(K--)tmp=H.top(),H.pop(),ans+=tmp.x,H.push(node(tmp.i,tmp.l,tmp.r,tmp.k+1));
- printf("%lld",ans);
- return 0;
- }
NOI2010 : 超级钢琴的更多相关文章
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- NOI2010超级钢琴 2
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 1296 Solved: 606[Submit][Status ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表
BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐 ...
- bzoj2006 [NOI2010]超级钢琴 (及其拓展)
bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...
- P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
P2048 [NOI2010]超级钢琴 区间和--->前缀和做差 多次查询区间和最大--->前缀和RMQ 每次取出最大的区间和--->堆 于是我们设个3元组$(o,l,r)$,表示左 ...
- 洛谷 P2048 [NOI2010]超级钢琴 解题报告
P2048 [NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为 ...
- bzoj千题计划162:bzoj2006: [NOI2010]超级钢琴
http://www.lydsy.com/JudgeOnline/problem.php?id=2006 输出最大的k个 sum[r]-sum[l-1] (L<=r-l+1<=R) 之和 ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
随机推荐
- k-means
参考:http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html k-means是无监督的聚类算法,比较简单,但包含的思想不简单, ...
- 异常:The absolute uri: http://www.springframework.org/security/tags cannot be resolved in either web.xml or the jar files deployed with this application
The absolute uri: http://www.springframework.org/security/tags cannot be resolved in either web.xml ...
- [转]Ubuntu 系统 Update-rc.d 命令
本文转自:http://wangyan.org/blog/ubuntu-update-rc-d.html 以防止原博客挂掉,特此做了备份. Ubuntu或者Debian系统中update-rc.d命令 ...
- python 下载文件 & 防盗链
偶然下载一种类型的资源,发现好多翻页,右键另存什么的,不胜其烦. 决定用python写几句代码搞定.核心代码如下: from urllib import urlretrieve from urllib ...
- CSS3弹性盒模型flexbox完整版教程
http://caibaojian.com/flexbox-guide.html 来自CSS Tricks上的一个教程,原文为:A Complete Guide to Flexbox.文中详细的介绍了 ...
- TCP/IP WebSocket MQTT
http://www.cnblogs.com/shanyou/p/4085802.html TCP/IP, WebSocket 和 MQTT
- 升级Windows10后Apache服务器启动失败的解决方法
升级windows10系统后,微软内置了ASP.NET的web高级服务,默认安装了IIS服务器和MSSQL数据库,因为80端口被占用的原因,导致Apache服务器无法正常启动,但是MySQL服务一切正 ...
- MySQL数据丢失情况分析
一.存储引擎层面丢失数据 由于在实际项目中,我们往往使用支持事务的InnoDB存储引擎.我们 ...
- 自定义Notification
private static void updateProgressNotification(Context cxt, int appsCount, int percent, String appNa ...
- linux dd命令刻录启动U盘详解
dd if=xxx.iso of=/dev/sdb bs=1M 用以上命令前必须卸载u盘,sdb是你的u盘,bs=1M是块的大小,后面的数值大,写的速度相对块一点,但也不是无限的,我一般选2M,注意, ...