QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#875169#9986. ShioriDecember456WA 117ms5968kbC++144.7kb2025-01-29 11:50:292025-01-29 11:50:30

Judging History

你现在查看的是最新测评结果

  • [2025-01-29 11:50:30]
  • 评测
  • 测评结果:WA
  • 用时:117ms
  • 内存:5968kb
  • [2025-01-29 11:50:29]
  • 提交

answer

#include <algorithm>
#include <cstdio>
#include <queue>

#define ls(o) o << 1
#define rs(o) o << 1 | 1

constexpr int MAXN = 500000 + 2;

int a[MAXN];

class Tag {
  public:
    int addVal, assignVal;

    Tag& operator +=(const Tag &rhs) {
        if (rhs.assignVal >= 0) {
            assignVal = rhs.assignVal;
            addVal = 0;
        }
        addVal += rhs.addVal;

        return *this;
    }
};

class Node {
  public:
    int maxVal, minVal, p, len;
    long long sum;

    Node operator +(const Node &rhs) const {
        return {
          std::max(maxVal, rhs.maxVal),
          std::min(minVal, rhs.minVal),
          minVal < rhs.minVal ? p : rhs.p,
          len + rhs.len,
          sum + rhs.sum
        };
    }

    Node operator +=(const Tag &tag) {
        if (tag.assignVal >= 0) {
            maxVal = minVal =
              tag.assignVal + tag.addVal;
            sum = (long long){maxVal} * len;
        } else {
            maxVal += tag.addVal;
            minVal += tag.addVal;
            sum += (long long){tag.addVal} * len;
        }

        return *this;
    }
};

class SegmentTree {
  public:
    int n;
    Node t[MAXN << 2];
    Tag tag[MAXN << 2];

    void push(int o, const Tag &tg) {
        t[o] += tg;
        tag[o] += tg;
    }

    void pushDown(int o) {
        if (!tag[o].addVal &&
          tag[o].assignVal < 0) {
            return;
        }

        push(ls(o), tag[o]);
        push(rs(o), tag[o]);

        tag[o] = {0, -1};
    }

    void pushUp(int o) {
        t[o] = t[ls(o)] + t[rs(o)];
    }

    void build(int o, int l, int r) {
        tag[o] = {0, -1};

        if (l == r) {
            scanf("%d", &t[o].maxVal);
            t[o].sum = t[o].minVal = t[o].maxVal;
            t[o].p = l;
            t[o].len = 1;

            return;
        }

        int mid = (l + r) >> 1;

        build(ls(o), l, mid);
        build(rs(o), mid + 1, r);

        pushUp(o);
    }

    void build(int _n) {
        build(1, 1, n = _n);
    }

    void update(
      int o, int l, int r,
      int x, int y, const Tag &tg
    ) {
        if (x <= l && r <= y) {
            return push(o, tg);
        }

        pushDown(o);
        int mid = (l + r) >> 1;

        if (x <= mid) {
            update(ls(o), l, mid, x, y, tg);
        }
        if (y > mid) {
            update(rs(o), mid + 1, r, x, y, tg);
        }

        pushUp(o);
    }

    void assign(int l, int r, int v) {
        update(1, 1, n, l, r, {0, v});
    }

    void add(int l, int r, int v) {
        update(1, 1, n, l, r, {v, -1});
    }

    Node query(int o, int l, int r, int x, int y) {
        if (x <= l && r <= y) {
            return t[o];
        }

        pushDown(o);
        int mid = (l + r) >> 1;

        if (y <= mid) {
            return query(ls(o), l, mid, x, y);
        }
        if (x > mid) {
            return query(rs(o), mid + 1, r, x, y);
        }
        return query(ls(o), l, mid, x, y)
          + query(rs(o), mid + 1, r, x, y);
    }

    Node query(int l, int r) {
        return query(1, 1, n, l, r);
    }
} segTree;

class Info {
  public:
    int l, r, maxVal, minVal, p;

    Info(int _l, int _r) {
        Node tmp = segTree.query(l = _l, r = _r);
        maxVal = tmp.maxVal;
        minVal = tmp.minVal;
        p = tmp.p;
    }

    bool operator <(const Info &rhs) const {
        return minVal < rhs.minVal;
    }
};

int main() {
    int n, m;
    scanf("%d%d", &n, &m);

    segTree.build(n);

    while (m --) {
        int op, l, r;
        scanf("%d%d%d", &op, &l, &r);

        if (op == 1) {
            int v;
            scanf("%d", &v);

            segTree.assign(l, r, v);
        }

        if (op == 2) {
            int delta = -1;

            std::priority_queue<Info> q;
            q.push(Info(l, r));

            while (q.size()) {
                Info iv = q.top();
                q.pop();

                if (iv.minVal > delta + 1) {
                    break;
                }
                delta = iv.minVal;

                if (iv.minVal == iv.maxVal) {
                    continue;
                }

                if (iv.p > iv.l) {
                    q.push(Info(iv.l, iv.p - 1));
                }
                if (iv.p < iv.r) {
                    q.push(Info(iv.p + 1, iv.r));
                }
            }

            if (delta >= 0) {
                segTree.add(l, r, delta + 1);
            }
        }

        if (op == 3) {
            printf("%lld\n", segTree.query(l, r).sum);
        }
    }

    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 5968kb

input:

5 8
0 7 2 1 0
1 2 4 0
2 1 3
2 3 4
3 1 3
1 2 3 4
3 1 4
2 1 5
3 2 5

output:

5
11
22

result:

ok 3 number(s): "5 11 22"

Test #2:

score: 0
Accepted
time: 0ms
memory: 5968kb

input:

1 1
0
1 1 1 0

output:


result:

ok 0 number(s): ""

Test #3:

score: -100
Wrong Answer
time: 117ms
memory: 5964kb

input:

10 500000
0 0 0 0 0 0 0 0 0 0
3 2 9
2 4 10
2 2 7
2 7 9
3 1 1
3 5 8
1 5 10 0
3 1 9
3 5 9
2 2 4
1 2 4 0
2 5 6
3 8 8
1 4 6 0
1 6 6 0
2 4 10
3 1 9
3 5 7
1 4 10 0
3 6 9
3 2 6
2 1 8
1 5 9 0
3 7 8
3 4 8
2 4 8
2 5 8
2 1 9
2 3 8
1 5 10 0
2 4 8
3 1 6
2 1 4
2 3 7
3 4 10
1 4 6 0
1 1 6 0
2 3 7
1 1 1 0
2 1 10
1 5...

output:

0
0
7
4
0
0
6
3
0
0
0
1
17
10
3
0
0
0
0
17
23
1
20
2
11
27
26
2
10
2
2
0
0
0
2
4
1
0
0
0
7
2
0
4
14
12
7
6
0
4
3
2
6
3
1
6
0
5
0
7
6
3
2
5
0
0
0
4
16
1
7
0
2
0
0
3
6
4
0
2
3
0
0
1
16
12
1
1
12
0
3
2
3
7
2
10
0
14
1
2
0
0
16
8
2
8
18
23
2
24
4
12
7
4
14
5
0
2
7
3
11
8
6
2
20
14
1
3
3
0
1
5
0
2
0
2
5
...

result:

wrong answer 3rd numbers differ - expected: '10', found: '7'