和POJ2823差不多的题目,一开始想到rmq但是空间太大了,然后用的线段树超时,加了自己写的输入才勉强2892ms水过,单调队列404ms.
/*
* NJOJACat.cpp
*
* Created on: Jun 7, 2013
* Author: root
*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <limits.h>
using namespace std;
const int maxn = 1000010;
int A[maxn];
int maxQ[maxn], minQ[maxn];
int n, k;
int f1, r1, f2, r2;
void readInt(int &x){
x = 0;
char ch = getchar();
while(!(ch >= '0' && ch <='9'))ch = getchar();
while(ch >= '0' && ch <= '9'){
x = x * 10 + (ch - '0');
ch = getchar();
}
}
void push1(int i){
while(r1 > f1 && A[maxQ[r1 - 1]] < A[i] ) --r1;
maxQ[r1++] = i;
}
void push2(int i){
while(r2 > f2 && A[minQ[r2 - 1]] > A[i] ) --r2;
minQ[r2++] = i;
}
void pop1(int i){
while(f1 < r1 && maxQ[f1] <= i)++f1;
}
void pop2(int i){
while(f2 < r2 && minQ[f2] <= i)++f2;
}
int main(){
while(~scanf("%d %d", &n, &k)){
for(int i = 0; i < n; ++i){
readInt(A[i]);
}
f1= 0, r1 = 0, f2 = 0, r2 = 0;
int ans = INT_MIN;
for(int i = 0; i < k; ++i){
push1(i);
push2(i);
}
int maxl = A[maxQ[f1]];
int minl = A[minQ[f2]];
int v = minl * k - (maxl - minl) * k;
ans = max(ans, v);
for(int i = k; i < n; ++i){
push1(i);
pop1(i - k);
push2(i);
pop2(i - k);
int maxl = A[maxQ[f1]];
int minl = A[minQ[f2]];
int v = minl * k - (maxl - minl) * k;
ans = max(ans, v);
}
if(ans <= 0){
printf("T_T\n");
}else{
printf("%d\n", ans);
}
}
return 0;
}