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;
}

最新文章

  1. yii2得到的数据对象转化成数组
  2. 在vs中怎样一次性的添加一个文件夹到解决方案里
  3. HDU1358:Period
  4. jq版本更新后无live函数的处理.
  5. HttpWebRequest上传文件(Excel等)
  6. (转)python struct简介
  7. bmp文件格式中rgb555与rgb888之间的转换,24位与16位位图的转换
  8. Basic FIFO Queue
  9. spring 406 (Not Acceptable)错误
  10. vs2012\2013\2015 添加 ActiveX制作控件插件 Visual Studio Installer
  11. MVC5 + EF6 + Bootstrap3系列教程
  12. mocha、chai、sinon和istanbul实现100%单元测试覆盖率
  13. sql server block如何查询并kill
  14. Producer Flow Control 和 vmQueueCursor
  15. Error[Li006]: duplicate definitions for &quot;******&quot;
  16. AVRStudio 6 设置F_CPU时钟频率
  17. 前端如何展示商品属性:SKU多维属性状态判断算法的应用-Vue 实现
  18. OOM三种类型
  19. /proc/vmstat 详解
  20. layer最大话.最小化.还原回调方法使用

热门文章

  1. Day10 - Python基础10 socketserver 实现并发
  2. 面向对象程序设计(JAVA) 第15周学习指导及要求
  3. 201871010132--张潇潇--《面向对象程序设计(java)》第十三周学习总结
  4. docker搭建kafka环境&amp;&amp;Golang生产和消费
  5. golang数据结构之稀疏数组
  6. 开发SSO单点登录需要注意的问题
  7. 【STM32H7教程】第16章 STM32H7必备的HAL库API(重要)
  8. JS实现网站楼层导航效果
  9. Saiku默认给数据类型的数据添加小数点问题处理(三十一)
  10. appium 使用name 定位报错 Locator Strategy &#39;name&#39; is not supported for this session【appium-desktop】