QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#420950 | #6134. Soldier Game | waynetu | WA | 0ms | 3596kb | C++20 | 3.5kb | 2024-05-25 06:19:55 | 2024-05-25 06:19:55 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
int N;
cin >> N;
vector<int> A(N);
for (int i = 0; i < N; ++i) {
cin >> A[i];
}
vector<vector<int64_t>> tree(N * 4, vector<int64_t>(4));
vector<tuple<int, int, int>> vec;
for (int i = 0; i < N; ++i) {
vec.emplace_back(A[i], i, -1);
if (i > 0) {
vec.emplace_back(A[i - 1] + A[i], i - 1, i);
}
}
sort(vec.rbegin(), vec.rend());
auto Build = [&]() {
auto dfs = [&](auto self, int l, int r, int o = 0) -> void {
if (r - l == 1) {
tree[o][0] = tree[o][1] = tree[o][2] = 4e-9;
tree[o][3] = 4e9;
return;
}
int m = (l + r) >> 1;
self(self, l, m, o * 2 + 1);
self(self, m, r, o * 2 + 2);
for (int s = 0; s < 4; ++s) {
tree[o][s] = 4e9;
}
for (int s = 0; s < 4; ++s) {
for (int t = 0; t < 4; ++t) {
// if ((s >> 1 & 1) == 0 && (t & 1) == 0) {
// tree[o][(s & 1) + 2 * (t >> 1 & 1)] =
// min(tree[o][(s & 1) + 2 * (t >> 1 & 1)],
// max({tree[o * 2 + 1][s], tree[o * 2 + 2][t],
// A[m - 1] + A[m]}));
// }
if ((s >> 1 & 1) == 1 && (t & 1) == 1) {
tree[o][(s & 1) + 2 * (t >> 1 & 1)] =
min(tree[o][(s & 1) + 2 * (t >> 1 & 1)],
max({tree[o * 2 + 1][s], tree[o * 2 + 2][t]}));
}
}
}
};
dfs(dfs, 0, N);
};
Build();
auto Update = [&](int p, int v) {
auto dfs = [&](auto self, int l, int r, int o = 0) -> void {
if (r - l == 1) {
tree[o][0] = tree[o][1] = tree[o][2] = 4e-9;
if (A[l] >= v) {
tree[o][3] = A[l];
} else {
tree[o][3] = 4e9;
}
return;
}
int m = (l + r) >> 1;
if (p < m) {
self(self, l, m, o * 2 + 1);
} else {
self(self, m, r, o * 2 + 2);
}
for (int s = 0; s < 4; ++s) {
tree[o][s] = 4e9;
}
for (int s = 0; s < 4; ++s) {
for (int t = 0; t < 4; ++t) {
for (int s = 0; s < 4; ++s) {
for (int t = 0; t < 4; ++t) {
if ((s >> 1 & 1) == 0 && (t & 1) == 0 && A[m - 1] + A[m] >= v) {
tree[o][(s & 1) + 2 * (t >> 1 & 1)] =
min(tree[o][(s & 1) + 2 * (t >> 1 & 1)],
max<int64_t>({tree[o * 2 + 1][s], tree[o * 2 + 2][t],
A[m - 1] + A[m]}));
}
if ((s >> 1 & 1) == 1 && (t & 1) == 1) {
tree[o][(s & 1) + 2 * (t >> 1 & 1)] =
min(tree[o][(s & 1) + 2 * (t >> 1 & 1)],
max<int64_t>({tree[o * 2 + 1][s], tree[o * 2 + 2][t]}));
}
}
}
}
}
};
dfs(dfs, 0, N);
};
int64_t ans = tree[0][3] - get<0>(vec[0]);
for (int i = 0, j = 0; i < vec.size(); i = j) {
while (j < vec.size() && get<0>(vec[j]) == get<0>(vec[i])) {
auto [v, x, y] = vec[j];
Update(x, v);
if (y != -1) {
Update(y, v);
}
j++;
}
ans = min(ans, tree[0][3] - get<0>(vec[i]));
}
cout << ans << "\n";
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3596kb
input:
3 5 -1 4 2 1 1 4 1 3 2 4 1 7
output:
1 1 0
result:
wrong answer 2nd numbers differ - expected: '2', found: '1'