QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#569470#9326. Gameucup-team004#WA 38ms3656kbC++204.5kb2024-09-16 23:23:092024-09-16 23:23:10

Judging History

This is the latest submission verdict.

  • [2024-09-16 23:23:10]
  • Judged
  • Verdict: WA
  • Time: 38ms
  • Memory: 3656kb
  • [2024-09-16 23:23:09]
  • Submitted

answer

#include <bits/stdc++.h>

using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;

constexpr i64 inf = 1E18;
template<class Info>
struct SegmentTree {
    int n;
    std::vector<Info> info;
    SegmentTree() : n(0) {}
    SegmentTree(int n_, Info v_ = Info()) {
        init(n_, v_);
    }
    template<class T>
    SegmentTree(std::vector<T> init_) {
        init(init_);
    }
    void init(int n_, Info v_ = Info()) {
        init(std::vector(n_, v_));
    }
    template<class T>
    void init(std::vector<T> init_) {
        n = init_.size();
        info.assign(4 << std::__lg(n), Info());
        std::function<void(int, int, int)> build = [&](int p, int l, int r) {
            if (r - l == 1) {
                info[p] = init_[l];
                return;
            }
            int m = (l + r) / 2;
            build(2 * p, l, m);
            build(2 * p + 1, m, r);
            pull(p);
        };
        build(1, 0, n);
    }
    void pull(int p) {
        info[p] = info[2 * p] + info[2 * p + 1];
    }
    void modify(int p, int l, int r, int x, const Info &v) {
        if (r - l == 1) {
            info[p] = v;
            return;
        }
        int m = (l + r) / 2;
        if (x < m) {
            modify(2 * p, l, m, x, v);
        } else {
            modify(2 * p + 1, m, r, x, v);
        }
        pull(p);
    }
    void modify(int p, const Info &v) {
        modify(1, 0, n, p, v);
    }
    Info rangeQuery(int p, int l, int r, int x, int y) {
        if (l >= y || r <= x) {
            return Info();
        }
        if (l >= x && r <= y) {
            return info[p];
        }
        int m = (l + r) / 2;
        return rangeQuery(2 * p, l, m, x, y) + rangeQuery(2 * p + 1, m, r, x, y);
    }
    Info rangeQuery(int l, int r) {
        return rangeQuery(1, 0, n, l, r);
    }
    template<class F>
    int findFirst(int p, int l, int r, int x, int y, F &&pred) {
        if (l >= y || r <= x) {
            return -1;
        }
        if (l >= x && r <= y && !pred(info[p])) {
            return -1;
        }
        if (r - l == 1) {
            return l;
        }
        int m = (l + r) / 2;
        int res = findFirst(2 * p, l, m, x, y, pred);
        if (res == -1) {
            res = findFirst(2 * p + 1, m, r, x, y, pred);
        }
        return res;
    }
    template<class F>
    int findFirst(int l, int r, F &&pred) {
        return findFirst(1, 0, n, l, r, pred);
    }
    template<class F>
    int findLast(int p, int l, int r, int x, int y, F &&pred) {
        if (l >= y || r <= x) {
            return -1;
        }
        if (l >= x && r <= y && !pred(info[p])) {
            return -1;
        }
        if (r - l == 1) {
            return l;
        }
        int m = (l + r) / 2;
        int res = findLast(2 * p + 1, m, r, x, y, pred);
        if (res == -1) {
            res = findLast(2 * p, l, m, x, y, pred);
        }
        return res;
    }
    template<class F>
    int findLast(int l, int r, F &&pred) {
        return findLast(1, 0, n, l, r, pred);
    }
};

struct Info {
    i64 x = -inf;
};
Info operator+(const Info &a, const Info &b) {
    return {std::max(a.x, b.x)};
}
void solve() {
    int n, c;
    std::cin >> n >> c;
    
    std::vector<int> l(n), r(n), a(n);
    for (int i = 0; i < n; i++) {
        std::cin >> l[i];
    }
    for (int i = 0; i < n; i++) {
        std::cin >> r[i];
    }
    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
    }
    
    SegmentTree<Info> dps(n), seg(n);
    std::vector<i64> dp(n, -inf);
    for (int i = n - 1; i >= 0; i--) {
        l[i] += i;
        r[i] += i;
        if (r[i] >= n) {
            dp[i] = std::max(0LL, dp[i]);
        }
        r[i] = std::min(r[i], n - 1);
        if (l[i] <= r[i]) {
            if (r[i] >= i + 1 + c) {
                dp[i] = std::max(dp[i], seg.rangeQuery(i + c + 1, r[i] + 1).x);
            }
            if (l[i] <= i + c) {
                dp[i] = std::max(dp[i], {-dps.rangeQuery(i + 1, l[i] + 1).x});
            }
        }
        dp[i] += a[i];
        dps.modify(i, {-dp[i]});
        if (i + c < n) {
            seg.modify(i + c, {-dps.rangeQuery(i, i + c + 1).x});
        }
    }
    
    std::cout << dp[0] - a[0] << "\n";
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int t = 1;
    std::cin >> t;
    
    while (t--) {
        solve();
    }
    
    return 0;
}

詳細信息

Test #1:

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

input:

2
6 2
1 1 2 2 1 1
2 1 3 2 1 1
2 3 1 -1 -1 1
4 4
1 1 1 1
2 2 1 1
-1 -3 -2 -4

output:

3
-9

result:

ok 2 number(s): "3 -9"

Test #2:

score: -100
Wrong Answer
time: 38ms
memory: 3656kb

input:

26667
8 0
7 3 3 3 1 1 1 3
7 7 5 4 1 2 2 7
46 31 41 67 61 100 52 36
10 7
8 3 7 4 6 2 4 3 8 1
10 4 8 5 10 5 4 3 9 1
56 26 -6 92 91 82 33 12 -3 54
5 5
2 1 1 1 1
4 3 3 2 1
-10 73 88 10 8
6 5
1 3 5 2 1 1
3 4 6 3 1 1
81 24 99 45 -1 52
9 0
4 7 1 3 1 2 1 2 1
7 7 7 4 5 4 3 2 1
-3 8 80 12 31 71 70 51 14
5 5
3...

output:

388
0
106
75
323
31
99
67
53
70
20
-2
132
72
375
126
190
414
287
29
204
155
-3
96
41
170
136
78
132
207
27
277
76
149
66
101
212
94
69
71
111
134
156
110
145
214
61
155
51
181
92
60
191
20
89
0
78
134
71
115
51
205
116
229
0
124
68
263
250
60
87
160
484
123
101
60
65
193
320
0
167
188
138
203
201
27...

result:

wrong answer 1st numbers differ - expected: '36', found: '388'