QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#30448 | #3857. Single-track railway | whereismyteammate# | WA | 3ms | 5640kb | C++20 | 1.1kb | 2022-04-28 18:44:23 | 2022-04-28 18:44:23 |
Judging History
answer
#include <bits/stdc++.h>
const int N = 2e5 + 50;
int n, k;
int64_t t[N], a[N], sum;
inline int lowbit(int x) {
return x & -x;
}
void add(int p, int v) {
++p;
for (; p < N; p += lowbit(p))
t[p] += v;
}
int64_t query(int p) {
++p;
int64_t r = 0;
for (; p; p -= lowbit(p))
r += t[p];
return r;
}
int64_t solve() {
// find such k that minimize max(sum[1..k], sum[k+1]..n)
if (n == 1) {
return a[1];
}
int l = 0, r = n, ans = -1;
while (l <= r) {
const int mid = l + r >> 1;
int v = query(mid);
if (v > sum - v) {
r = mid - 1;
}
else {
ans = mid;
l = mid + 1;
}
}
assert(ans != -1);
int64_t v = query(ans);
assert((sum - v) >= v);
return (sum - v) - v;
}
int main() {
std::cin >> n;
--n;
for (int i = 1; i <= n; ++i) {
std::cin >> a[i];
sum += a[i];
add(i, a[i]);
}
int m;
std::cin >> m;
std::cout << solve() << '\n';
while (m--) {
int j, v;
std::cin >> j >> v;
sum -= a[j];
add(j, -a[j]);
a[j] = v;
sum += a[j];
add(j, a[j]);
std::cout << solve() << '\n';
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 3ms
memory: 5640kb
input:
2 39 7 1 20 1 70 1 56 1 37 1 37 1 37 1 91
output:
39 20 70 56 37 37 37 91
result:
ok 8 lines
Test #2:
score: 0
Accepted
time: 2ms
memory: 3688kb
input:
3 8 41 0
output:
33
result:
ok single line: '33'
Test #3:
score: -100
Wrong Answer
time: 3ms
memory: 3612kb
input:
30 86 100 80 30 23 17 90 98 20 3 43 31 49 14 14 47 13 44 7 30 50 29 67 68 56 69 28 61 81 10 21 23 7 99 16 70 3 50 4 17 26 42 7 37 10 43 26 83 13 96
output:
8 79 70 93 25 10 11 17 5 18 27
result:
wrong answer 2nd lines differ - expected: '19', found: '79'