DP 단일 큐: Max Sum of Max-K-sub-sequence
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
hdu3415
Description
Given a circle sequence A[1],A[2],A[3]......A[n]. Circle sequence means the left neighbour of A[1] is A[n] , and the right neighbour of A[n] is A[1].
Now your job is to calculate the max sum of a Max-K-sub-sequence. Max-K-sub-sequence means a continuous non-empty sub-sequence which length not exceed K.
Input
The first line of the input contains an integer T(1<=T<=100) which means the number of test cases.
Then T lines follow, each line starts with two integers N , K(1<=N<=100000 , 1<=K<=N), then N integers followed(all the integers are between -1000 and 1000).
Output
For each test case, you should output a line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the minimum start position, if still more than one , output the minimum length of them.
Sample Input
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
Sample Output
7 1 3
7 1 3
7 6 2
-1 1 1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 100010
#define INF 1<<31-1;
int a[2*N], sum[2*N];
int num[2*N];
int main(){
int n, k;
int beg, end;
int i, j, h, t;
int maxn;
int cnt;
scanf("%d", &cnt);
while(cnt --){
scanf("%d %d", &n, &k);
sum[0] = 0;
for(i = 1; i <= n; i ++){
scanf("%d", &a[i]);
sum[i] = sum[i-1] + a[i];
}
for(i = n+1; i <= 2*n; i ++){
sum[i] = sum[i-1] + a[i-n]; // ,
}
maxn = -INF;
beg = 0; end = 0;
h = 0;
t = 0;
for(i = 0; i < n + k; i ++){
while(h < t && sum[num[t-1]] > sum[i])
t--;
num[t++] = i;// sum[num[i]] , sum, sum[i+1]-sum[num[ ]]
while(h < t && i+1 - num[h] > k)
h ++;// m,
if(sum[i+1] - sum[num[h]] > maxn){
maxn = sum[i+1] - sum[num[h]];// maxs
beg = num[h] + 1;
end = i + 1;
}
}
if(beg > n)
beg -= n;
if(end > n)
end -= n;
cout << maxn << " " << beg << " " << end << endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 입출력 I/O스트림(stream) 자바에서 입출력을 수행하려면 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림(stream)이라고 정의했다. 스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.