QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#572132#9310. Permutation Counting 4Peanut_TangTL 0ms11836kbC++142.6kb2024-09-18 12:24:072024-09-18 12:24:08

Judging History

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

  • [2024-09-18 14:56:40]
  • hack成功,自动添加数据
  • (/hack/835)
  • [2024-09-18 14:41:06]
  • hack成功,自动添加数据
  • (/hack/831)
  • [2024-09-18 12:24:08]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:11836kb
  • [2024-09-18 12:24:07]
  • 提交

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...

output:


result: