hdu3415 單調佇列求區間最大和
http://acm.hdu.edu.cn/showproblem.php?pid=3415
Problem 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.
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).
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
/**
hdu3415 單調佇列
題目大意:給出一個有N個數字(N<=10^5)的環狀序列,讓你求一個和最大的連續子序列。這個連續子序列的長度小於等於K。
分析:因為序列是環狀的,所以可以在序列後面複製前k-1個數字。如果用s[i]來表示複製過後的序列的前i個數的和,那麼任意一個子序列[i..j]的和就等於s[j]-s[i-1]。
對於每一個j,用s[j]減去最小的一個s[i](i>=j-k)就可以得到以j為終點長度不大於k的和最大的序列了。將原問題轉化為這樣一個問題後,就可以用單調佇列解決了。
單調佇列即保持佇列中的元素單調遞增(或遞減)的這樣一個佇列,可以從兩頭刪除,只能從隊尾插入。單調佇列的具體作用在於,由於保持佇列中的元素滿足單調性,
對於上述問題中的每個j,可以用O(1)的時間找到對應的s[i]。(保持佇列中的元素單調遞增的話,隊首元素便是所要的元素了)。
維護方法:對於每個j,我們插入s[j-1]的下標,插入時從隊尾插入。為了保證佇列的單調性,我們從隊尾開始刪除元素,直到隊尾元素對應的值比當前需要插入的s[j-1]小,
就將當前元素下標插入到隊尾。之所以可以將之前的佇列尾部元素全部刪除,是因為它們已經不可能成為最優的元素了,因為當前要插入的元素位置比它們靠前,
對應的值比它們小。我們要找的,是滿足(i>=j-k)的i中最小的s[i]。在插入元素後,從隊首開始,將不符合限制條件(i<j-k)的元素全部刪除,此時佇列一定不為空。(因為剛剛插入了一個一定符合條件的元素)。
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int inf=1e9;
const int N=200002;
int n,k,T,a[N],q[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
a[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]+=a[i-1];
}
for(int i=n+1;i<n+k;i++)
a[i]=a[n]+a[i-n];
int m=n+k-1;
int head=0,tail=0;
int maxx=-inf;
int l,r;
for(int i=1;i<=m;i++)
{
while(head<tail&&a[i-1]<a[q[tail-1]])
tail--;
q[tail++]=i-1;
while(head<tail&&i-q[head]>k)
head++;
if(maxx<a[i]-a[q[head]])
{
maxx=a[i]-a[q[head]];
l=q[head]+1;
r=i>n?i%n:i;
}
}
printf("%d %d %d\n",maxx,l,r);
}
return 0;
}
相關文章
- HDU3415 Max Sum of Max-K-sub-sequence (DP+單調佇列)佇列
- 單調佇列佇列
- 單調棧/單調佇列佇列
- 單調佇列雙端佇列佇列
- 單調棧 和 單調佇列佇列
- 單調棧和單調佇列佇列
- POJ 2823 單調佇列佇列
- hdu 3415 單調佇列佇列
- HDU 3530 單調佇列佇列
- hdu 3401 單調佇列+DP佇列
- hdu 4122 單調佇列佇列
- 單調佇列最佳化 DP佇列
- POJ 3017 單調佇列dp佇列
- hdu4374單調佇列+dp佇列
- 佇列-單端佇列佇列
- noi.ac #289. 電梯(單調佇列)佇列
- HDU 3530 Subsequence (dp+單調佇列)佇列
- poj3017 dp+單調佇列佇列
- 多重揹包問題的單調佇列優化佇列優化
- HDU3530 單調佇列的應用佇列
- C語言 簡單的佇列(陣列佇列)C語言佇列陣列
- Python中堆、棧、佇列之間的區別Python佇列
- hdu 4122Alice's mooncake shop(單調佇列)佇列
- [學習筆記] 單調佇列最佳化DP - DP筆記佇列
- POJ 2823Sliding Window(單調佇列水題)佇列
- 程式設計求一維陣列中最大和最小的元素值程式設計陣列
- RabbitMQ-簡單佇列MQ佇列
- 單向鏈式佇列佇列
- C++STL第四篇(最簡單的棧和佇列)C++佇列
- 棧,佇列,優先順序佇列簡單介面使用佇列
- 高效利用佇列的空間佇列
- 求子陣列的最大和陣列
- 求區間不同數的個數【樹狀陣列求解】陣列
- POJ2823 Sliding Window (單調佇列的基本應用)佇列
- 多重揹包O(N*V)演算法詳解(使用單調佇列)演算法佇列
- laravel 佇列的簡單使用Laravel佇列
- 佇列_單向連結串列佇列
- 程式間通訊--訊息佇列佇列