luoguP2048 [NOI2010]超级钢琴
upd 2019.12.10 latex和markdown化
题意
解析:
先考虑暴力:将每个区间求出来,放进一个堆里,取出前k个就是答案。
期望得分:20,原因:TLE
code(对,我真写了):
#include<bits/stdc++.h>
using namespace std;
const int maxn=5*1e5+10;
int n,k,L,R,ans;
int sum[maxn];
priority_queue<int> q;
int main()
{
scanf("%d%d%d%d",&n,&k,&L,&R);
for(int i=1;i<=n;i++) scanf("%d",&sum[i]),sum[i]+=sum[i-1];
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
if(j-i+1>=L&&j-i+1<=R) q.push(sum[j]-sum[i-1]);
for(int i=1;i<=k;i++) ans+=q.top(),q.pop();
printf("%d",ans);
return 0;
}
考虑优化,先看这道题
这道题中我们并没有将所有的组合全部求出,而是先将一些最优解放入堆中,取出后放入次于它的最优解来更新。
这道题也可以用相同的方法来优化。
首先区间和肯定用前缀和优化了。
我们先固定左端点,将从每个点向右的最优解放入,记为四元组:\((x,l,r,t)\),\(x\)是左端点,\(l\)和\(r\)是右端点的范围,t是当前解的右端点的位置。求解该区间的最优解可以用ST表解决。
将这些数放入后,我们每从堆中取出一个四元组\((x,l,r,t)\),加上它的答案后,向堆中放入\((x,l,t-1,query(l,t-1))\)和\((x,t+1,query(t+1,r))\)(相当于放入对于\(x\)的\([l,r]\)区间除去\(t\)后的最优解,注意判断\(l,r\)是否为\(t\))
取\(k\)次即为答案。
之前做过的题思想还是要记住的~
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5*1e5+10;
int n,k,L,R;
int st[maxn][30];
ll ans;
ll sum[maxn];
void init()
{
for(int i=1;i<=n;i++) st[i][0]=i;
int t=(int)log2(n);
for(int j=1;j<=t;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
{
int x=st[i][j-1],y=st[i+(1<<(j-1))][j-1];
st[i][j]=sum[x]>sum[y]?x:y;
}
}
int query(int l,int r)
{
int k=(int)log2(r-l+1);
int x=st[l][k],y=st[r-(1<<k)+1][k];
return sum[x]>sum[y]?x:y;
}
struct node
{
int x,l,r,t;
bool operator < (const node& y)const
{
return sum[t]-sum[x-1]<sum[y.t]-sum[y.x-1];
}
};
priority_queue<node> q;
int main()
{
scanf("%d%d%d%d",&n,&k,&L,&R);
for(int i=1;i<=n;i++) scanf("%lld",&sum[i]),sum[i]+=sum[i-1];
init();
//puts("1111");
for(int i=1;i<=n;i++)
if(i+L-1<=n) q.push((node){i,i+L-1,min(n,i+R-1),query(i+L-1,min(n,i+R-1))});//puts("111");
//puts("11");
while(k--)
{
int x=q.top().x,l=q.top().l,r=q.top().r,t=q.top().t;
// printf("%d %d %d %d\n",x,l,r,t);
q.pop();ans+=sum[t]-sum[x-1];
//puts("111");
if(l!=t) q.push((node){x,l,t-1,query(l,t-1)});
if(r!=t) q.push((node){x,t+1,r,query(t+1,r)});
//puts("111");
}
printf("%lld",ans);
return 0;
}
luoguP2048 [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) 之和 ...
随机推荐
- cf 之lis+贪心+思维+并查集
https://codeforces.com/contest/1257/problem/E 题意:有三个集合集合里面的数字可以随意变换位置,不同集合的数字,如从第一个A集合取一个数字到B集合那操作数+ ...
- bzoj1812 [IOI2005]riv河流
题目链接 problem 给出一棵树,每个点有点权,每条边有边权.0号点为根,每个点的代价是这个点的点权\(\times\)该点到根路径上的边权和. 现在可以选择最多K个点.使得每个点的代价变为:这个 ...
- 使用ArcPy拓扑检查的基本步骤
拓扑检查是GIS的特性,在ArcGIS可使用多种方法进行检查,包括: 1.在数据集上右键按向导建立: 2.使用拓扑工具箱的一系列工具分步建立: 3.创建模型工具,制作专门的拓扑工具: 4.利用ArcP ...
- Codeforces Round #603 (Div. 2) F. Economic Difficulties dp
F. Economic Difficulties An electrical grid in Berland palaces consists of 2 grids: main and reserve ...
- 基于Docker的Consul服务发现集群搭建
在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章.本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架 ...
- React: React组件创建的三种方式
一.简介 在前面介绍的React组件知识中,对于组件的创建我只是用了其中某一种方式.其实,在2013年React诞生之初,对于React组件的创建,仅仅只有一种方式,也即createClass函数,在 ...
- SLB外部端口非80时---》转发到nginx---》URL跳转丢失端口的解决方案
配置nginx反向代理时遇到一个问题,当设置nginx监听80端口时转发请求没有问题.但一旦设置为监听其他端口,就一直跳转不正常: 如,访问欢迎页面时应该是重定向到登录页面,在这个重定向的过程中端口丢 ...
- hive on spark 常用配置
常用设置 reset; set hive.execution.engine=spark; set hive.map.aggr = false; set hive.auto.convert.join = ...
- 【趣学程序】Linux上安装Tengine(Nginx)
linux 安装tengine tengine是什么 tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳 ...
- solr集群Server refused connection at: http://127.0.0.1:6060/solr/ego 注册zookeepr自动使用内网ip
引导:适用于各种注册服务,zookeeper和被注册的服务器不在同一ip上,产生的注册了127.0.0.1本地ip地址 在使用solr集群操作的时候,报了如下的错误 org.apache.solr.c ...