杭电 hdu 3415

#include<stdio.h>
 #include<iostream>
 #include<string>
 #include<fstream>
 using namespace std;
 class PEOPLE
 {
 public:
  long value;
  long tag;
 };
 
typedef PEOPLE elem_t;
 class QUEUE
 {
 public:
  elem_t a[200020];
  long r,f;
  void init()
  {
   r=0;
   f=1;
  }
  void push(elem_t n)
  {
  a[++r]=n;
  }
  void pop_rear()
  {
   r--;
  }
  void pop_front()
  {
   f++;
  }
  elem_t& get_front()
  {
   return a[f];
  }
  elem_t& get_rear()
  {
   return a[r];
  }
  bool empty()
  {
   return r<f;
  }
 };
 
QUEUE que;
   int a[200020];
  int dp_sum[200020];
int main()
 {
  int T;
  //freopen("e:\\data_in.txt","r",stdin);
  int n,k;
  int i,j;

 
  cin>>T;
  while(T--)
 {  
  que.init();
   cin>>n>>k;
   long sum=0;
 
  

   for(i=1;i<=n;i++)
    cin>>a[i];
   
  
  
   int st;
   int en;
   long maxsum=-2100000000;
  
   for(i=n+1;i<=n+k;i++)  //把 a1,a2,a3,a4加在 an+1,an+2,an+k上面
  
    a[i]=a[i-n];
  

   for(i=1;i<=n+k;i++)
   {
    sum+=a[i];
   dp_sum[i]=sum;
     int start=i-k;
     if(start<1)
      start=0;

      if(sum-dp_sum[start]>maxsum)
   {
    st=start+1;
    en=i;
    maxsum=sum-dp_sum[start];
   }
   }
 

 

   for(i=1;i<=n+k;i++)
   {
  
    while(!que.empty()&&que.get_rear().value>dp_sum[i]) //      可恶的que.get_rear().value>=dp_sum[i] 害我WA了无数次
     que.pop_rear();                                                             //

    PEOPLE one;
    one.tag=i;
    one.value=dp_sum[i];
    que.push(one);
    int start=i-k;
     if(start<1)
      start=0;

     while(!que.empty()&&que.get_front().tag<start)
      que.pop_front();


     if(que.get_front().tag!=i&&dp_sum[i]-que.get_front().value>maxsum)
     {
      maxsum=dp_sum[i]-que.get_front().value;
 
     st=que.get_front().tag+1;
      en=i;

     }
    
   }
  
 
      st=(st%(n))?(st%(n)):n;
   en=(en%(n))?(en%(n)):n;
  
   cout<<maxsum<<" "<<st<<" "<<en<<endl;
  
  
  }
 
 
  return 0;
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值