POJ2823 Sliding Window (单调队列)
2020-12-13 05:49
标签:des style blog http color os strong io POJ2823 Description Your task is to determine the maximum and minimum values in the sliding window at each position. Input Output Sample Input Sample Output Source 大意: 看题目中那个表格很容易懂,就是有个滑动区间,每次我们要找到这个区间中的最大值、最小值。 题解: 单调队列。 单调队列是DP优化的一种,能实现O(VN)的多重背包。这题虽然不是DP,不过能怒用一发单调队列。 单调队列是用一个单调的队列来存储必要的元素,并不存储无用的元素。在这题的求最小值的过程中: 元素按顺序读入队列q,当队列为空时直接读入;当队列非空时,若队尾的元素不小于当前要入队的元素,则踢出队尾,直到队尾元素小于要入队的元素或者队为空为止。 再开一个数组p,存储队列中的元素在原数据中的下标。 像这样: (读元素a[i]) 然后检查队首,如果p存储的队首的元素下标表示该元素已经滑出区间,则将其踢出,像这样: (检查队首、踢出过期元素) 经过这2个操作后,q[l]就是所求的当前区间的最小值。然后i++,再进行这2个操作,就能得到下一个最小值。换一个符号就能求最大值了。 这两个操作有什么深意呢? 读取时那样的操作,保证了队列中存储了递增的最小若干个数,在队首能立即得到当前区间最小的数(若那个数已经滑出了区间,则它会被踢出), 当那个数滑出区间时能立即找到下一个最小的数。 就这两个简单的操作,用极低的复杂度,就能完成找区间滑动到每个地方的最小值/最大值!我就问你碉不碉! 代码: POJ2823 Sliding Window (单调队列),搜素材,soscw.com POJ2823 Sliding Window (单调队列) 标签:des style blog http color os strong io 原文地址:http://www.cnblogs.com/yuiffy/p/3885832.html
Time Limit: 12000MS
Memory Limit: 65536K
Total Submissions: 38342
Accepted: 11359
Case Time Limit: 5000MS
Window position
Minimum value
Maximum value
[1 3 -1] -3 5 3 6 7
-1
3
1 [3 -1 -3] 5 3 6 7
-3
3
1 3 [-1 -3 5] 3 6 7
-3
5
1 3 -1 [-3 5 3] 6 7
-3
5
1 3 -1 -3 [5 3 6] 7
3
6
1 3 -1 -3 5 [3 6 7]
3
7
8 3
1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3
3 3 5 5 6 7
1 while(l
while(p[l]
1 #include
文章标题:POJ2823 Sliding Window (单调队列)
文章链接:http://soscw.com/essay/31809.html