QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#877845#6626. Real Mountainshhoppitree#0 0ms10072kbC++262.3kb2025-02-01 11:04:232025-02-01 11:04:25

Judging History

This is the latest submission verdict.

  • [2025-02-01 11:04:25]
  • Judged
  • Verdict: 0
  • Time: 0ms
  • Memory: 10072kb
  • [2025-02-01 11:04:23]
  • Submitted

answer

#include <bits/stdc++.h>

using namespace std;

constexpr int N = 1e6 + 5, inf = 1e9, P = 1e6 + 3;

int a[N], pre[N], suf[N], Pre[N], Suf[N];

signed main() {
    int n; scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    map<int, vector<int> > opt;
    for (int i = 1; i <= n; ++i) pre[i] = max(pre[i - 1], a[i]);
    for (int i = n; i >= 1; --i) suf[i] = max(suf[i + 1], a[i]);
    
    vector<int> a_disk(a + 1, a + n + 1);
    ranges::sort(a_disk);
    auto rng = ranges::unique(a_disk);
    a_disk.erase(rng.begin(), rng.end());
    auto getId = [&](int x) {
        return ranges::lower_bound(a_disk, x) - a_disk.begin() + 1;
    };

    static int mn[N];
    fill(mn + 1, mn + a_disk.size() + 1, inf);
    
    auto query = [&](int x) {
        int res = inf;
        for (; x <= (int)a_disk.size(); x += x & -x) res = min(res, mn[x]);
        return res;
    };

    auto modify = [&](int x, int y) {
        for (; x; x -= x & -x) mn[x] = min(mn[x], y);
    };

    for (int i = 1; i <= n; ++i) {
        int ind = getId(a[i]);
        Pre[i] = query(ind + 1);
        modify(ind, a[i]);
    }
    fill(mn + 1, mn + a_disk.size() + 1, inf);
    for (int i = n; i >= 1; --i) {
        int ind = getId(a[i]);
        Suf[i] = query(ind + 1);
        modify(ind, a[i]);
    }

    auto Sum = [&](int l, int r) -> int {
        return 1ll * (l + r) * (r - l + 1) / 2 % P;
    };

    int res = 0;
    for (int i = 1; i <= n; ++i) {
        opt[a[i]].push_back(i);
        opt[min(pre[i], suf[i])].push_back(-i);
        res = (res + Sum(a[i], min(pre[i], suf[i]) - 1)) % P;
    }

    set<int> S;
    for (auto [x, y] : opt) {
        if (opt.upper_bound(x) == opt.end()) break;
        int nxt = opt.upper_bound(x) -> first;
        for (auto z : y) {
            if (z > 0) S.insert(z);
            else S.erase(S.find(-z));
        }
        if (S.empty()) continue;
        if (S.size() == 1) {
            res = (res + 1ll * (Pre[*S.begin()] + Suf[*S.begin()]) * (nxt - x)) % P;
        } else {
            res = (res + (2ll * S.size() - 3) * Sum(x, nxt - 1) + (0ll + Pre[*S.begin()] + Suf[*S.rbegin()] + min(Suf[*S.begin()], Pre[*S.rbegin()])) * (nxt - x)) % P;
        }
    }

    printf("%d\n", res);
    return 0;
}

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 3
Accepted
time: 0ms
memory: 10068kb

input:

3
29 9 9

output:

0

result:

ok 1 number(s): "0"

Test #2:

score: 3
Accepted
time: 0ms
memory: 10072kb

input:

3
62 20 71

output:

7287

result:

ok 1 number(s): "7287"

Test #3:

score: 0
Wrong Answer
time: 0ms
memory: 10072kb

input:

10
72 33 22 22 13 49 53 57 72 85

output:

39115

result:

wrong answer 1st numbers differ - expected: '40403', found: '39115'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Skipped

Dependency #3:

0%

Subtask #5:

score: 0
Skipped

Dependency #2:

0%

Subtask #6:

score: 0
Skipped

Dependency #3:

0%

Subtask #7:

score: 0
Skipped

Dependency #1:

0%