QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#420950#6134. Soldier GamewaynetuWA 0ms3596kbC++203.5kb2024-05-25 06:19:552024-05-25 06:19:55

Judging History

你现在查看的是最新测评结果

  • [2024-05-25 06:19:55]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3596kb
  • [2024-05-25 06:19:55]
  • 提交

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'