QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#877845 | #6626. Real Mountains | hhoppitree# | 0 | 0ms | 10072kb | C++26 | 2.3kb | 2025-02-01 11:04:23 | 2025-02-01 11:04:25 |
Judging History
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%