QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#572132 | #9310. Permutation Counting 4 | Peanut_Tang | TL | 0ms | 11836kb | C++14 | 2.6kb | 2024-09-18 12:24:07 | 2024-09-18 12:24:08 |
Judging History
answer
#include <bits/stdc++.h>
const int N = 2e6 + 5;
int tt, n;
struct HEAP {
int rt[N], val[N], dst[N], ls[N], rs[N];
void Up(int p) {
if (p && dst[p] != dst[rs[p]] + 1) {
dst[p] = dst[rs[p]] + 1;
Up(rt[p]);
}
}
void Down(int p) {} // 下传标记
int Find(int x) { // x所在堆堆顶编号
if (rt[x] == x) {
return x;
}
rt[x] = Find(rt[x]);
return rt[x];
}
int Top(int x) { // x所在堆堆顶值
return val[Find(x)];
}
void Del(int p) { // 将编号为p的结点从堆中删除,指定权值删除需要map
val[p] = -1;
rt[ls[p]] = ls[p];
rt[rs[p]] = rs[p];
rt[p] = Merge(ls[p], rs[p]);
}
void Pop(int x) { // x所在堆堆顶
Del(Find(x));
}
int Merge(int x, int y) {
if (!x || !y) {
return x | y;
}
if (val[x] > val[y]) {
std::swap(x, y);
}
Down(x);
Down(y);
rs[x] = Merge(rs[x], y);
if (dst[ls[x]] < dst[rs[x]]) {
std::swap(ls[x], rs[x]);
}
dst[x] = dst[rs[x]] + 1;
Up(x);
rt[ls[x]] = rt[rs[x]] = rt[x] = x;
return x;
}
void Print(int p) {
printf("%d : \n", p);
for (int i = 1; i <= n + n; i++) {
if (Find(p) == Find(i)) {
printf("## %d %d\n", i, val[i]);
}
}
}
} H;
void Solve() {
scanf("%d", &n);
for (int i = 1; i <= n + n; i++) {
H.rt[i] = i;
H.ls[i] = H.rs[i] = H.dst[i] = 0;
if (i > n) {
H.val[i] = n + 1;
}
}
for (int i = 1; i <= n; i++) {
int l, r;
scanf("%d %d", &l, &r);
H.val[i] = r;
H.rt[l + n] = H.Merge(H.rt[l + n], H.rt[i]);
}
// for (int i = 1; i <= n; i++) {
// H.Print(i + n);
// puts("**************");
// }
for (int i = 1; i <= n; i++) {
int x = H.Top(i + n);
// printf("@ %d %d\n", i, x);
// H.Print(i + n);
// puts("-----");
if (H.Top(i + n) == n + 1) {
puts("0");
return;
}
while (H.Top(i + n) == x) {
H.Pop(i + n);
}
// H.Print(i + n);
// puts("-----");
H.rt[x + 1 + n] = H.Merge(H.rt[x + 1 + n], H.rt[i + n]);
// H.Del(i + n);
// H.Print(x + 1 + n);
}
puts("1");
}
int main() {
scanf("%d", &tt);
while (tt--) {
Solve();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 11836kb
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: -100
Time Limit Exceeded
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...