#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <iostream>
using namespace std;
const int MAX_SIZE = 100010 * 2;
const int INFINITE = 99999999;
int num[MAX_SIZE];
int sum[MAX_SIZE];
int q[MAX_SIZE];
int ind[MAX_SIZE];
int begin;
int end;
/**
Problem: HDU3415-Max sum of max-k sequence 【0.3%达成!】
Thanks to : LPP学长,YL学姐,辛苦了两位= =开化我这种愚人
Reference:http://www.cppblog.com/wuxu/archive/2010/08/24/124575.aspx
Knowledge Point:单调队列
关于单调队列还有一篇好的Reference看,入门级的但是讲的足够详细了。
http://www.docin.com/p-49960245.html 用单调性优化优先队列。
Fucking Misunderstanding:
傻逼错误1:误把sum(i,j)写作了sum(i,j) = sum(i) - sum(j)!实际上这样就把元素j抛出去了,应该是sum(i)-sum(j-1)!
Thought:
【大半夜写的,发现bug欢迎fix。。。拿出证据,而不是“我觉得”三个字儿,谢谢】
好吧,都说过了是单调队列,递增的。
这里就当做对单调队列的一个大summary好了。
所谓单调队列,就是其中的内容是单调的,其中元素对应的数组下标也是单调的。
这里的单调指的不是单调上升就是单调下降。
单调队列的名字中虽然带了队列两个字,但是跟队列还是有区别的,不过也有共同之处。
共同之处就是在头(front)的位置取元素,由于单调性可以保证一类问题在单调队列的头处总有最优解,所以是可以这么做的。
不同之处就是单调队列的头部是可以删除元素的(我习惯用front++来实现),当然,跟队列一样,也可以从尾部添加、删除元素(但是头部不能添加元素哦!)
那么,这道题的解题思路在哪儿呢?
就是将给出数组的A[i]求和,Sum[i]表示从[0,i]区间数组A[]元素的和。
那么,如果求[i,j]区间的和,只要用sum[i]