QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#566349 | #9310. Permutation Counting 4 | electricstick | TL | 1749ms | 66336kb | C++20 | 3.4kb | 2024-09-15 23:55:17 | 2024-09-15 23:55:18 |
Judging History
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;
}
详细
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...