HDU 3415 Max Sum of Max-K-sub-sequence

来源:互联网 发布:小明域名首页台湾k 编辑:程序博客网 时间:2024/05/21 00:20

我用单调队列做的,队列内按区间和从大到小排列,则队列头到当前点的区间和最大,需要注意的是数组要开大一点不然wrong到哭啊。

#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <map>#include <vector>#include <cmath>#include <stack>#include <queue>#include <cstdlib>#include <algorithm>using namespace std;typedef __int64 int64;typedef long long ll;#define M 100005#define N 1000005#define max_inf 0x7f7f7f7f#define min_inf 0x80808080#define mod 1000000007int q[N];int n , k , arr[N] , sum[N];void Solve(){int i , MAX = min_inf , len , spos;int front , rear;front = rear = 0;for (i = 1 ; i <= n+k ; i++){while (rear > front && sum[i]-sum[q[rear-1]-1] < arr[i])rear--;q[rear++] = i;while (front < rear && i-q[front] >= k)front++;int temp = sum[i]-sum[q[front]-1];if (temp > MAX){MAX = temp;len = i-q[front]+1;spos = q[front];}else if (temp == MAX && spos == q[front]){len = min(len , i-q[front]+1);}}int lpos = spos+len-1;if (lpos > n)lpos -= n;printf("%d %d %d\n",MAX , spos , lpos);}int main(){int i , t;scanf("%d",&t);while (t--){scanf("%d%d",&n,&k);for (sum[0] = 0 , i = 1 ; i <= n ; i++){scanf("%d",arr+i);arr[n+i] = arr[i];sum[i] = sum[i-1]+arr[i];}for (i = n+1 ; i <= 2*n ; i++)sum[i] = sum[i-1]+arr[i];Solve();}return 0;}


 

原创粉丝点击