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) 之和 ...
随机推荐
- np.unique( )的用法
该函数是去除数组中的重复数字,并进行排序之后输出. 换句话,我想从一个图片选取 1000个不同的点,随机采点经常遇到相同的点,造成重复.np.unique就是用来解决这个问题
- C++ 拷贝构造函数 copy ctor & 拷贝赋值函数 copy op=
类中含有 指针类型 的成员变量时,就必须要定义 copy ctor 和 copy op= copy ctor 请见: class Rectangle { public: Rectangle(Rec ...
- LG2602/BZOJ1833 「ZJOI2010」数字计数 数位DP
问题描述 LG2602 BZOJ1833 题解 数位\(\mathrm{DP}\)板子题. 注意限制位数.前导零. \([a,b]=[1,b]-[1,a-1]\) \(\mathrm{Code}\) ...
- Servlet一次乱码排查后的总结
由来 在写一个小小的表单提交功能的时候,出现了乱码,很奇怪request上来的参数全部是乱码,而从数据库查询出来的中文显示到页面正常,锁定肯定是request对象那里出了问题.后来经过排查,发现是我封 ...
- 用vbs和ADSI管理Windows账户
ADSI (Active Directory Services Interface)是Microsoft新推出的一项技术,它统一了许多底层服务的编程接口,程序员可以使用一致的对象技术来访问这些底层服务 ...
- C#开发BIMFACE系列29 服务端API之获取模型数据14:获取图纸列表
系列目录 [已更新最新开发文章,点击查看详细] 一个三维模型中可能包含对应多张二维图纸列表,本篇主要介绍如何获取模型文件对应的图纸列表. 请求地址:GET https://api.bimfac ...
- flask--数据库迁移之连环踩坑记
flask数据库迁移命令: python manage.py db init python manage.py db migrate python manage.py db upgrade 1.报错: ...
- js ajax设置和获取自定义header信息的方法总结
目录 1.js ajax 设置自定义header 1.1 方法一: 1.2 方法二: 2.js ajax 获取请求返回的response的header信息 3.js ajax 跨域请求的情况下获取自定 ...
- Python模块import本质是什么?import是什么
写这篇文章主要是对Python的import模块或包的机制有了更深层级的一个理解,也在具体工作中得到了一点实践,这种思考是由上一篇文章<__main__内置模块预加载Shotgun接口的妙用 ...
- P3376 网络最大流模板(Dinic + dfs多路增广优化 + 炸点优化 + 当前弧优化)
### P3376 题目链接 ### 这里讲一下三种优化的实现以及正确性. 1.dfs多路增广优化 一般的Dinic算法中是这样的,bfs() 用于标记多条增广路,以至于能一次 bfs() 出多次 d ...