QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#566349#9310. Permutation Counting 4electricstickTL 1749ms66336kbC++203.4kb2024-09-15 23:55:172024-09-15 23:55:18

Judging History

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

  • [2024-09-18 14:56:40]
  • hack成功,自动添加数据
  • (/hack/835)
  • [2024-09-18 14:41:06]
  • hack成功,自动添加数据
  • (/hack/831)
  • [2024-09-17 12:14:52]
  • hack成功,自动添加数据
  • (/hack/825)
  • [2024-09-15 23:55:18]
  • 评测
  • 测评结果:TL
  • 用时:1749ms
  • 内存:66336kb
  • [2024-09-15 23:55:17]
  • 提交

answer

#pragma GCC optimize("Ofast", "inline", "unroll-loops")
#include <algorithm>
#include <chrono>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <queue>
#include <random>
#include <vector>
using namespace std;
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = a; i >= n; i--)
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define bit(x) (1ll << (x))
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
using VI = vector<int>;
using PII = pair<int, int>;
using ll = long long;
using ull = unsigned long long;
using db = double;
using ldb = long double;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
// head

#ifdef DEBUG
#include "debug.cpp"
#else
#define debug(...) 42
#endif

const int N = 1e6 + 10;
int n;
struct line {
  std::vector<int> v;
  int sz;
  void add(int x) {
    v.push_back(x);
    sz++;
  }
  void del(int x) {
    v.push_back(-x);
    sz--;
  }
  void make() {
    std::sort(v.begin(), v.end(), [](int x, int y) {
      int a = std::abs(x), b = std::abs(y);
      return a != b ? a < b : x > y;
    });
    std::vector<int> w;
    for (auto &x : v) {
      if (x > 0) {
        w.push_back(x);
      } else {
        w.pop_back();
      }
    }
    v.swap(w);
  }
} lst[N], rst[N];
struct node {
  int sz, id;
  bool operator<(const node &o) const { return sz < o.sz; }
};
std::priority_queue<node> lp, rp;
void add(int l, int r) {
  lst[l].add(r);
  lp.push({lst[l].sz, l});
  rst[r].add(l);
  rp.push({rst[r].sz, r});
}
void del(int l, int r) {
  lst[l].del(r);
  lp.push({lst[l].sz, l});
  rst[r].del(l);
  rp.push({rst[r].sz, r});
}
int work() {
  while (true) {
    if (lp.top().sz >= rp.top().sz) {
      auto [sz, l] = lp.top();
      lp.pop();
      if (sz == 1) {
        return 1;
      }
      if (lst[l].sz != sz) {
        continue;
      }
      lst[l].make();
      auto tmp = lst[l].v;
      int pl = l;
      for (auto &r : tmp) {
        if (r < pl) {
          return 0;
        }
        del(l, r);
        add(pl, r);
        pl = r + 1;
      }
    } else {
      auto [sz, r] = rp.top();
      rp.pop();
      if (sz == 1) {
        return 1;
      }
      if (rst[r].sz != sz) {
        continue;
      }
      rst[r].make();
      auto tmp = rst[r].v;
      std::reverse(tmp.begin(), tmp.end());
      int pr = r;
      for (auto &l : tmp) {
        if (l > pr) {
          return 0;
        }
        del(l, r);
        add(l, pr);
        pr = l - 1;
      }
    }
  }
}
int main() {
  cin.tie(nullptr)->sync_with_stdio(false);
  int t;
  cin >> t;
  while (t--) {
    // auto st = clock();
    cin >> n;
    // n = 1e6;
//    uniform_int_distribution<int> e(1, n);
    for (int i = 1; i <= n; i++) {
      lst[i].v.clear();
      lst[i].sz = 0;
      rst[i].v.clear();
      rst[i].sz = 0;
    }
    while (!lp.empty()) {
      lp.pop();
    }
    while (!rp.empty()) {
      rp.pop();
    }
    for (int i = 1; i <= n; i++) {
      int l, r;
      cin >> l >> r;
      // l = e(rng);
      // r = e(rng);
      // if (l > r) swap(l, r);
      add(l, r);
    }
    cout << work() << '\n';
    // auto ed = clock();
    // cout << "time: " << 1.0 * (ed - st) / CLOCKS_PER_SEC << '\n';
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 4ms
memory: 66144kb

input:

4
5
1 2
1 5
1 2
1 2
2 2
5
1 1
2 4
2 3
5 5
3 4
5
3 5
1 2
3 4
3 5
3 3
5
1 5
1 4
4 5
5 5
1 2

output:

0
1
0
0

result:

ok 4 tokens

Test #2:

score: 0
Accepted
time: 607ms
memory: 66328kb

input:

66725
14
7 7
4 6
7 8
8 13
2 13
6 13
6 10
14 14
1 10
9 11
7 9
3 8
4 12
5 12
12
2 6
3 6
7 11
2 5
1 1
6 12
8 12
2 3
7 9
7 8
1 10
1 4
10
4 8
4 4
6 10
9 10
2 3
2 7
1 3
3 4
2 2
3 10
20
3 12
10 14
19 20
19 20
1 9
7 9
13 16
17 17
16 18
2 11
5 19
6 17
11 17
3 6
3 11
7 20
8 17
3 18
10 15
9 20
16
5 10
2 10
2 1...

output:

1
1
0
0
1
0
1
1
0
1
1
0
0
0
0
0
1
0
1
0
0
1
0
0
0
1
0
1
0
0
0
0
1
0
1
1
1
1
1
0
1
0
1
1
1
1
1
1
1
1
0
1
1
0
0
0
0
0
0
1
0
1
1
0
1
1
1
0
1
0
1
0
0
0
1
1
1
0
0
1
1
1
1
0
1
1
1
1
1
1
1
0
1
0
0
1
1
0
0
1
1
0
0
1
1
1
1
1
1
0
0
1
1
1
0
0
1
1
0
0
1
0
1
0
1
0
1
0
0
0
0
0
0
0
0
1
1
1
1
1
0
0
0
1
0
0
1
0
1
1
...

result:

ok 66725 tokens

Test #3:

score: 0
Accepted
time: 1749ms
memory: 66336kb

input:

6655
155
28 58
68 100
6 47
98 109
11 133
38 153
73 118
126 153
24 43
71 118
109 135
6 104
40 101
24 139
100 136
135 136
40 148
70 117
92 124
63 64
45 55
16 128
65 86
20 49
126 138
30 141
127 146
21 155
49 139
27 34
39 145
20 53
12 41
3 107
38 78
106 109
61 102
20 99
134 135
23 99
10 69
105 113
36 75...

output:

0
0
1
1
0
1
0
0
1
1
0
1
1
1
0
0
1
1
1
0
1
0
1
0
1
0
0
1
1
0
1
0
0
0
1
1
0
1
0
1
0
1
0
1
1
1
1
0
1
0
0
0
0
0
1
1
0
1
0
1
0
1
0
1
0
0
1
0
0
1
0
0
0
1
0
1
1
0
1
0
0
0
0
0
0
1
0
1
0
0
1
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
1
1
0
0
0
0
0
1
0
1
0
1
0
0
0
0
1
0
1
0
0
1
0
1
0
0
1
0
1
0
0
1
1
1
0
0
0
0
...

result:

ok 6655 tokens

Test #4:

score: -100
Time Limit Exceeded

input:

666
1967
396 1664
818 1954
564 805
1106 1322
568 1687
853 1482
153 1092
566 670
154 562
114 1372
574 1879
482 1083
499 1566
2 1384
291 1947
122 1714
1277 1900
740 1024
887 1478
146 254
944 1807
574 1193
225 1933
43 1278
1017 1482
958 1180
86 1230
1658 1679
980 1542
1044 1127
762 989
1128 1567
552 17...

output:


result: