4 6 3 6 -1 2 -6 5 -5 6 4 6 -1 2 -6 5 -5 6 3 -1 2 -6 5 -5 6 6 6 -1 -1 -1 -1 -1 -1
7 1 3 7 1 3 7 6 2 -1 1 1
题目与单调队列—— HDU 4193 Non-negative Partial Sums类似,不在赘述,直接给出代码:
#include <stdio.h> #define MAX_NUM 100000 #define NEGATIVE_INF -0x7ffffff int sum[MAX_NUM*2+5]; //存储循环序列的前段和 int n; //序列长度 int k; //子序列的最大长度 int mq[MAX_NUM+5]; //单调不增队列,队列元素为a[]的下标 int front; //队首指针 int rear; //队尾指针,指向队尾的下一个位置 inline void InitMonotonicQueue(void) { front = rear = 0; } inline bool IsEmpty(void) { return front == rear; } void Push(int i) { while (!IsEmpty() && sum[mq[rear-1]] < sum[i]) { rear--; } mq[rear++] = i; } inline int Front(void) { return mq[front]; } inline void Pop(void) { front++; } int main(void) { int ncases; scanf("%d", &ncases); while (ncases-- != 0) { scanf("%d%d", &n, &k); int i; for (i = 1; i <= n; i++) { scanf("%d", &sum[i]); } for (i = n+1; i < n+k; i++) { sum[i] = sum[i-n]; } for (i = 2; i < n+k; i++) { sum[i] += sum[i-1]; } InitMonotonicQueue(); for (i = 1; i <= k; i++) { Push(i); } int maxSum = sum[Front()]; int startPos = 1, endPos = Front(); for (i = k+1; i < n+k; i++) { if (!IsEmpty() && Front() + k <= i) { Pop(); } Push(i); int p = Front(); int s = sum[p] - sum[i-k]; if (s > maxSum) { maxSum = s; startPos = i - k + 1; endPos = p; } } if (endPos > n) { endPos = endPos % n; } printf("%d %d %d\n", maxSum, startPos, endPos); } return 0; }