超级钢琴 2010年NOI
/*
自己yy的奇葩做法居然A了23333
不过空间好像很大 时间好像略慢.....
毕竟不是正解
前缀维护sum值 枚举区间起点
然后终点的坐标可以确定在一个范围
可持久化线段树查询区间第1大
然后放到堆里 注意每个从堆里取出来再把这个区间第2大的放进去
这里k可能减成负的 注意特判 开始wa了
还有开longlong
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
#define pa pair<int,int>
#define mk make_pair
#define maxn 500010
using namespace std;
int n,m,l,r,k,x,root[maxn],a[maxn],s[maxn],cnt[maxn],tot;
long long ans;
struct node{
int sum,lc,rc;
}t[maxn**];
priority_queue<pa>q;
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
int Build(int S,int L,int R){
++tot;t[tot].sum=S;
t[tot].lc=L;t[tot].rc=R;
return tot;
}
void Insert(int &root,int pre,int l,int r,int pos){
root=Build(t[pre].sum+,t[pre].lc,t[pre].rc);
if(l==r)return;
int mid=l+r>>;
if(pos<=mid)Insert(t[root].lc,t[pre].lc,l,mid,pos);
else Insert(t[root].rc,t[pre].rc,mid+,r,pos);
}
int Query(int L,int R,int l,int r,int k){
if(l==r)return l;
int mid=l+r>>;
int sum=t[t[R].lc].sum-t[t[L].lc].sum;
if(k<=sum)return Query(t[L].lc,t[R].lc,l,mid,k);
else return Query(t[L].rc,t[R].rc,mid+,r,k-sum);
}
int main()
{
freopen("piano.in","r",stdin);
//freopen("piano.out","w",stdout);
n=init();k=init();l=init();r=init();
for(int i=;i<=n;i++){
x=init();
s[i]=s[i-]+x;
a[i]=s[i];
}
int num,pos,L,R,p,len,t;
sort(a+,a++n);
num=unique(a+,a++n)-a-;
for(int i=;i<=n;i++){
pos=lower_bound(a+,a++num,s[i])-a;
Insert(root[i],root[i-],,num,pos);
}
while(!q.empty())q.pop();
for(int i=;i+l-<=n;i++){
L=i+l-,R=min(n,i+r-);
len=R-L+;++cnt[i];t=len-cnt[i]+;
pos=Query(root[L-],root[R],,num,t);
q.push(mk(a[pos]-s[i-],i));
}
for(int i=;i<=k;i++){
p=q.top().second;
ans+=q.top().first;q.pop();
L=p+l-,R=min(n,p+r-);
len=R-L+;++cnt[p];t=len-cnt[p]+;
if(t<=)continue;
pos=Query(root[L-],root[R],,num,t);
q.push(mk(a[pos]-s[p-],p));
}
cout<<ans<<endl;
return ;
}
超级钢琴 2010年NOI的更多相关文章
- [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)
[BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...
- [NOI 2010]超级钢琴
Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙 的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙 ...
- 题解 【NOI2010】超级钢琴
[NOI2010]超级钢琴 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
- 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2473 Solved: 1211[Submit][Statu ...
- bzoj2006 noi2010 超级钢琴 主席树 + 优先队列
Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2435 Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送 ...
- 2006: [NOI2010]超级钢琴 - BZOJ
Description小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为 ...
- 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 ...
随机推荐
- 使用jQuery UI方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- jquery.js 库中的 选择器
<html><head><script type="text/javascript" src="jquery.js">< ...
- 20141127 测试使用Word2013书写博客(代码高亮+公式支持)。
PS :又经过几次测试,发现用于Word2010的高亮插件在Word2013上排版效果不是很好,慎用.不过公式编辑倒是挺方便的 测试使用Word2013书写博客. 大概一个月前,使用WindowL ...
- finalize与System.gc()
finalize Finalize是Object类的一个方法,可以用来被重写 finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只 ...
- struts2令牌,防止重复提交
struts2的令牌,可以用来防止重复提交,其原理是在提交jsp页面中,写入一个隐藏域name="token",然后在action中定义一个变量token并get.set.在服务器 ...
- android之apk自动更新解析包失败问题
在apk自动更新(相关问题可以看我的博客http://blog.csdn.net/caicongyang) 从服务器下载完成后,点击notification提示安装时,每次都报解析包失败错误!首先我想 ...
- 【POJ】2418 Hardwood Species
简单字典树. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 128 ty ...
- Gvim各种插件配置(windows环境下)
1.Vundle插件:https://github.com/gmarik/Vundle.vim 用于管理Vim插件,安装此插件需要系统中已安装git,参考链接:Git for Windows安装和基本 ...
- bzoj3668
noi水题,直接推出来每一位上取什么值才能取1直接搞就可以了 ..] of longint; x,n,i,j,k,t,m,ans:longint; fl:boolean; s:string; ch:c ...
- 【模拟】NEERC15 A Adjustment Office (2015-2016 ACM-ICPC)(Codeforces GYM 100851)
题目链接: http://codeforces.com/gym/100851 题目大意: 一个N*N的矩阵A,Ai,j=i+j,Q次操作,每次分两种,R r取出第r行还未被取的所有数,并输出和.C c ...