博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解题:NOI 2010 超级钢琴
阅读量:5221 次
发布时间:2019-06-14

本文共 1397 字,大约阅读时间需要 4 分钟。

WC时候写的题,补一下

做法比较巧妙:记录每个位置和它当前对应区间的左右端点,做前缀和之后重载一下小于号,用优先队列+ST表维护当前最大值。这样贡献就是区间最大值和端点左边差分一下,可以O(1)得到。每次从最大值所在位置分裂成两个小的对应区间扔回优先队列里即可。

1 // luogu-judger-enable-o2 2 #include
3 #include
4 #include
5 #include
6 #include
7 using namespace std; 8 const int N=500005,M=21; 9 int n,k,l,r;10 long long ans;11 int val[N],sum[N];12 pair
st[N][M];13 void Make_ST()14 {15 int lgg=log2(n);16 for(int i=1;i<=n;i++) st[i][0]=make_pair(sum[i],i);17 for(int i=1;i<=lgg;i++)18 for(int j=1;j<=n-(1<
Qmax(int l,int r)22 {23 int lgg=log2(r-l+1);24 return max(st[l][lgg],st[r-(1<
tmp=Qmax(lpt,rpt);32 return tmp.first-sum[pts-1];33 }34 };35 bool operator < (a x,a y)36 {37 return x.Maxi()
hp;40 void Insert(int nd,int ll,int rr)41 {42 if(ll>rr) return;43 hp.push((a){nd,ll,rr});44 }45 int main()46 {47 scanf("%d%d%d%d",&n,&k,&l,&r);48 for(int i=1;i<=n;i++)49 scanf("%d",&val[i]),sum[i]=sum[i-1]+val[i];50 Make_ST();51 for(int i=1;i<=n;i++)52 if(i+l-1<=n) hp.push((a){i,i+l-1,min(n,i+r-1)});53 for(int i=1;i<=k;i++)54 {55 a tmp=hp.top(); 56 hp.pop(),ans+=tmp.Maxi();57 int nd=tmp.pts,ll=tmp.lpt,rr=tmp.rpt;58 int pt=Qmax(ll,rr).second;59 Insert(nd,ll,pt-1),Insert(nd,pt+1,rr); 60 }61 printf("%lld",ans);62 return 0;63 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/10414970.html

你可能感兴趣的文章
细说WebSocket - Node篇
查看>>
Extjs控件之 grid打印功能
查看>>
枚举类型(不常用)递归
查看>>
minggw 安装
查看>>
Jquery操作cookie,实现简单的记住用户名的操作
查看>>
[BZOJ1196][HNOI2006]公路修建问题 二分答案+最小生成树
查看>>
【原创】大数据基础之Zookeeper(4)应用场景
查看>>
静态变量数组实现LRU算法
查看>>
中文系统 上传file的input显示英文
查看>>
比callback更简洁的链式执行promise
查看>>
android permission
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
事务备份还原分离附加
查看>>
.net 文本框只允许输入XX,(正则表达式)
查看>>
[BSGS][哈希]luogu P3846 可爱的质数
查看>>
Python 第四十五章 MySQL 内容回顾
查看>>
iostat参数说明
查看>>
Python-Mac 安装 PyQt4
查看>>
实验2-2
查看>>
String,StringBuffer与StringBuilder的区别?? .
查看>>