#3#4#7 WA

P1440 求m区间内的最小值

wfirstzhang @ 2024-05-12 15:14:33

#include <cstdio>
using namespace std;
struct que_ele { int pos, value; que_ele():pos(0),value(0){} };
que_ele min_que[16266035];
int front = 0, tail = 0;
int insert(const int num, const int period, const int pos) {
    while (tail >= front && min_que[front].pos <= pos - period)
        front++;
    const int res = min_que[front].value; //前period项的队列头
    while (tail >= front && min_que[tail - 1].value >= num)
        tail--; //比num大的踢出队列
    min_que[tail].value = num;
    min_que[tail++].pos = pos;
    return res;
}
inline int& query_min(void) {
    return min_que[front].value;
}
int main() {
    int n, m, temp = 0;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &temp);
        printf("%d\n", insert(temp, m, i));
    }
    return 0;
}

第三个点数据

答案输出

0 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 12 12 12 12
12 12 22 22 22 22 22 22 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 33 33 33 33 33 33 33
37 37 19 19 19 19 19 19 19 19
19 19 19 19 19 19 19 28 28 19
19 19 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 1 1 1
1 1 1 1 1 1 1 1 1 1

我的输出

0 5 5 5 5 5 5 5 5 5
5 5 5 5 5 12 12 12 12 12
12 22 22 22 22 22 22 22 17 17
17 17 17 17 17 17 17 17 17 17
17 17 33 33 33 33 33 33 33 37
37 37 37 44 44 44 44 44 28 28
28 28 28 28 28 28 28 28 28 28
188 56 56 65 65 29 29 29 29 29
29 29 29 27 27 27 27 27 186 19
19 19 19 19 19 19 18 2 2 2

代码 70 分,目测有些问题。


by Xrange @ 2024-05-12 15:52:21

你可以用priority_queue逝一下


by masonxiong @ 2024-05-12 15:53:57

@Xrange 这题考的单调队列,不是优先队列吧


by Xrange @ 2024-05-12 16:10:58

@masonxiong 那deque???


by Xrange @ 2024-05-12 16:46:52

AC部分代码:

deque的定义:

struct ty { int id,val; }a[2000100];
long long n,m,sq[2000100];

deque的主要部分:

for(int i=1;i<=n;i++) {
    while(!q.empty()&&q.back().val>=a[i].val)
        q.pop_back();
    q.push_back(a[i]);
    while(!q.empty()&&q.front().id<i-m)
        q.pop_front();
    sq[i]=q.front().val;
}

@wfirstzhang @masionxiong


by masonxiong @ 2024-05-12 17:47:07

@Xrange

同志,你似乎对双端队列,优先队列和单调队列有一些误解

所谓“优先队列”,即 std::priority_queue,可以 O(\log n) 维护数列最值

所谓“双端队列”,即 std::deque,维护一个序列,支持随机访问和 O(1) 的首尾增删

所谓“单调队列”,即 monotonous_queue,这个并没有在 STL 中,它是一种 OI 中常用(?)的数据结构,也是本题考查的部分,就是你写的那些


by Xrange @ 2024-05-12 17:53:25

@masonxiong 抱歉我是xxs


by Xrange @ 2024-05-12 20:17:06

我说deque 实现没说思想是 deque !!!


by wfirstzhang @ 2024-05-12 21:44:11

@Xrange @masonxiong 找到问题了,原来写成 tail \ge front 了,改成 tail > front,问题解决。


by Xrange @ 2024-05-13 16:48:29

@wfirstzhang 这和 !q.empty() 等价


|