CodeForces 332B Maximum Absurdity

来源:互联网 发布:淘宝网怎么用微信支付 编辑:程序博客网 时间:2024/04/26 05:35

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


原创粉丝点击