http://codeforces.com/problemset/problem/332/B
给出n个数,再个一个长度,问在n个数的数列中,找到2个相应长度的数串求和最大,且这两个数串不能重叠。只要对数列进行类似于求前缀和的操作,既可以加快速度,一道不算太难的预处理的题目。
#include<bits/stdc++.h>
using namespace std;
int a[222222];
long long int b[222222];
long long int c[222222];
long long int w[222222];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
int js=1;
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(i>m)
{
b[++js]=b[js-1]-a[i-m]+a[i];
}
else b[1]+=a[i];
}
long long int ans=-1;
int w1,w2;
w[js+1]=js;
for(i=js;i>=1;i--)
{
if(b[i]>=c[i])
{
c[i]=b[i];
c[i-1]=b[i];
w[i]=i;
}
else{
c[i-1]=c[i];
w[i]=w[i+1];
}
}
for(i=1;i<=js;i++)
{
if(b[i]+c[i+m]>ans)
{
ans=b[i]+c[i+m];
w1=i;
w2=w[i+m];
}
}
cout<<w1<<" "<<w2<<endl;
}
return 0;
}