题目链接:###

WOJ1318

题目分析:###

首先我们要知道当这是一个线性的序列的时候应该怎么做:最大子序和

这里是线性的,就把数组复制两遍即可

好像有些细节要处理(也可能是我代码写丑了),具体的都在代码里,挺好理解的


代码:###

#include<bits/stdc++.h>
#define MAXN (100000+5)
using namespace std;
inline int read(){
int cnt=0,f=1;char c;
c=getchar();
while(!isdigit(c)){
if(c=='-')f=-f;
c=getchar();
}
while(isdigit(c)){
cnt=cnt*10+c-'0';
c=getchar();
}
return cnt*f;
}
int n,k,t,l=1,r=1,ans=-(1<<21);
int ansl,ansr;
int a[2*MAXN],sum[2*MAXN],q[2*MAXN],pos[2*MAXN],f[2*MAXN];
int main(){
t=read();
while(t--){
l=r=0;
q[0]=0;pos[0]=0;
ans=-(1<<30);
n=read();k=read();
for(register int i=1;i<=n;i++){
a[i]=a[i+n]=read();sum[i]=sum[i+n]=0;if(a[i]>ans){ans=a[i];ansl=ansr=i;}
}
for(register int i=1;i<=2*n;i++)sum[i]=sum[i-1]+a[i];
for(register int i=1;i<=2*n;i++){
int u=sum[i];
while(u<q[r]&&l<=r)r--;
q[++r]=u;pos[r]=i;
while((pos[l]<i-k||pos[l]<i-n)&&l<=r)l++;
int v=q[l];
if(l==r)continue;
if(u-v>ans){
ans=u-v;
ansl=pos[l]+1;ansr=i;
if(ansl>n)ansl-=n;
if(ansr>n)ansr-=n;
}
}
printf("%d %d %d\n",ans,ansl,ansr);
}
return 0;
}

最新文章

  1. noi前机房日常
  2. python :表单验证--对每一个输入框进行验证
  3. 设计模式之 -- 状态模式(State)
  4. mysql命令行工具
  5. 从头学Qt Quick(1) --体验快速构建动态效果界面
  6. Android --- 斗地主 [牌桌实现源码]
  7. RDLC系列之六 打印纸张的大小(未解决)
  8. quartz 数据表字典
  9. lintcode:将二叉树拆成链表
  10. POJ 1001 Exponentiation
  11. delphi 编写一个dos 窗体
  12. GCD 和延时调用
  13. 持续集成Jenkins + robot framework + git
  14. bshare
  15. 改变图像,运用match方法判断
  16. Hibernate中fetch和lazy介绍
  17. 二、Redis安装
  18. CISCO运维记录之3650堆叠设备升级IOS(Version 16.3.6版本存在bug)
  19. laravel 资源控制器
  20. 1.5.3 GROUP BY子句

热门文章

  1. Android Webview的测试
  2. JavaScript 实现块级作用域
  3. POJ2155 Matrix 二维线段树
  4. ALVtree 显示BOM结构
  5. (30)java web的hibernate使用-c3p0连接池配置
  6. log4j 路径环境变量配置和log4j加载配置
  7. Swift语言学习(三)基础操作符
  8. RandomUtils
  9. Android「后台下载」Feb.24小记
  10. Python3中使用PyMongo的方法详解