QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#834865#9865. Dollshos_lyricWA 0ms4032kbC++144.7kb2024-12-28 05:06:522024-12-28 05:06:53

Judging History

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

  • [2025-01-08 13:49:40]
  • hack成功,自动添加数据
  • (/hack/1434)
  • [2024-12-28 05:06:53]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:4032kb
  • [2024-12-28 05:06:52]
  • 提交

answer

#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;

using Int = long long;

template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")


struct Set {
  // max{ceil(log_64(n)), 1}
  int log64N, n;
  vector<unsigned long long> a[6];
  explicit Set(int n_ = 0) : n(n_) {
    assert(n >= 0);
    int m = n ? n : 1;
    for (int d = 0; ; ++d) {
      m = (m + 63) >> 6;
      a[d].assign(m, 0);
      if (m == 1) {
        log64N = d + 1;
        break;
      }
    }
  }
  bool empty() const {
    return !a[log64N - 1][0];
  }
  bool contains(int x) const {
    return (a[0][x >> 6] >> (x & 63)) & 1;
  }
  void insert(int x) {
    for (int d = 0; d < log64N; ++d) {
      const int q = x >> 6, r = x & 63;
      a[d][q] |= 1ULL << r;
      x = q;
    }
  }
  void erase(int x) {
    for (int d = 0; d < log64N; ++d) {
      const int q = x >> 6, r = x & 63;
      if ((a[d][q] &= ~(1ULL << r))) break;
      x = q;
    }
  }
  // max s.t. <= x (or -1)
  int prev(int x) const {
    if (x > n - 1) x = n - 1;
    for (int d = 0; d <= log64N; ++d) {
      if (x < 0) break;
      const int q = x >> 6, r = x & 63;
      const unsigned long long lower = a[d][q] << (63 - r);
      if (lower) {
        x -= __builtin_clzll(lower);
        for (int e = d; --e >= 0; ) x = x << 6 | (63 - __builtin_clzll(a[e][x]));
        return x;
      }
      x = q - 1;
    }
    return -1;
  }
  // min s.t. >= x (or n)
  int next(int x) const {
    if (x < 0) x = 0;
    for (int d = 0; d < log64N; ++d) {
      const int q = x >> 6, r = x & 63;
      if (static_cast<unsigned>(q) >= a[d].size()) break;
      const unsigned long long upper = a[d][q] >> r;
      if (upper) {
        x += __builtin_ctzll(upper);
        for (int e = d; --e >= 0; ) x = x << 6 | __builtin_ctzll(a[e][x]);
        return x;
      }
      x = q + 1;
    }
    return n;
  }
};


// [0, n)
bool check(const vector<int> &as) {
  const int n = as.size();
  auto mn = as, mx = as;
  Set on(n);
  for (int i = 0; i < n; ++i) on.insert(i);
  queue<int> que;
  auto visit = [&](int r) -> void {
    if (1 <= r && r < n) {
      const int l = on.prev(r - 1);
      if (mx[l] + 1 == mn[r] || mx[r] + 1 == mn[l]) {
        que.push(r);
      }
    }
  };
  for (int i = 1; i < n; ++i) visit(i);
  for (; que.size(); ) {
    const int r = que.front();
    que.pop();
    if (on.contains(r)) {
      const int l = on.prev(r - 1);
      on.erase(r);
      chmin(mn[l], mn[r]);
      chmax(mx[l], mx[r]);
      visit(on.prev(l - 1));
      visit(l);
    }
  }
  const bool ret = (on.next(1) >= n);
// cerr<<"[check] "<<as<<": "<<ret<<endl;
  return ret;
}

int N;
vector<int> A;

bool check(int l, int r) {
  if (r > N) return false;
  vector<pair<int, int>> ais;
  for (int i = l; i < r; ++i) ais.emplace_back(A[i], i);
  sort(ais.begin(), ais.end());
  vector<int> bs;
  for (const auto &ai : ais) bs.push_back(ai.second - l);
  return check(bs);
}

int main() {
  for (int numCases; ~scanf("%d", &numCases); ) { for (int caseId = 1; caseId <= numCases; ++caseId) {
    scanf("%d", &N);
    A.resize(N);
    for (int i = 0; i < N; ++i) {
      scanf("%d", &A[i]);
    }
    
    int ans = 0;
    for (int i = 0; i < N; ) {
      int lo = i + 1, hi = i + 2;
      for (; check(i, hi); ) {
        lo = hi;
        hi = i + (hi - i) * 2;
      }
      for (; lo + 1 < hi; ) {
        const int mid = (lo + hi) / 2;
        (check(i, mid) ? lo : hi) = mid;
      }
// cerr<<COLOR("33")<<i<<" "<<lo<<COLOR()<<endl;
      ++ans;
      i = lo;
    }
    printf("%d\n", N - ans);
  }
#ifndef LOCAL
  break;
#endif
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

8
4
2 1 4 3
4
1 4 2 3
4
3 1 4 2
5
1 3 5 2 4
5
1 4 2 5 3
5
2 5 3 1 4
6
1 3 6 5 2 4
6
2 5 1 3 6 4

output:

3
2
2
3
3
3
4
4

result:

wrong answer 2nd numbers differ - expected: '3', found: '2'