QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#878939#9733. Heavy-light DecompositionPinkRabbit#WA 5ms3968kbC++202.0kb2025-02-01 19:06:212025-02-01 19:06:25

Judging History

This is the latest submission verdict.

  • [2025-02-01 19:06:25]
  • Judged
  • Verdict: WA
  • Time: 5ms
  • Memory: 3968kb
  • [2025-02-01 19:06:21]
  • Submitted

answer

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <set>
using std::cin, std::cout;

#define F(i, a, b) for(int i = a; i <= (b); ++i)
#define F2(i, a, b) for(int i = a; i < (b); ++i)
#define dF(i, a, b) for(int i = a; i >= (b); --i)

void Solve();
int main() {
    cin.sync_with_stdio(false);
    cin.tie(nullptr);
    int tests = 1;
    cin >> tests;
    while (tests--)
        Solve();
    return 0;
}

using LL = long long;
const int Mod = 998244353;

const int Inf = 0x3f3f3f3f;
const LL InfLL = 0x3f3f3f3f3f3f3f3f;

const int MN = 500005;

int n, k;
std::vector<std::pair<int, int>> V[MN];
int p[MN];

void Solve() {
    cin >> n >> k;
    F(x, 1, n)
        V[x].clear();
    int mx = 0;
    F(i, 1, k) {
        int l, r;
        cin >> l >> r;
        V[r - l + 1].push_back({l, r});
        mx = std::max(mx, r - l + 1);
    }
    if ((int)V[mx].size() >= 2) {
        int px = 0;
        dF(x, mx - 1, 1)
            if (V[x].empty()) {
                px = x;
                break;
            }
        if (!px)
            return void(cout << "IMPOSSIBLE\n");
        bool ok = false;
        dF(x, px - 1, 1)
            if (!V[x].empty())
                ok = true;
        if (!ok)
            return void(cout << "IMPOSSIBLE\n");
    }
    F(x, 1, n)
        for (auto [l, r] : V[x])
            F(i, l + 1, r)
                p[i] = i - 1;
    int pp = 0;
    while (true) {
        if ((int)V[mx].size() == 1) {
            int rt = V[mx][0].first;
            p[rt] = pp;
            F(x, 1, mx - 1)
                for (auto [l, r] : V[x])
                    p[l] = rt;
            break;
        }
        auto [l0, r0] = V[mx].back();
        p[l0] = pp;
        F(j, 0, (int)V[mx].size() - 2)
            p[V[mx][j].first] = l0;
        V[mx - 1].push_back({l0 + 1, r0});
        pp = l0;
        --mx;
    }
    F(i, 1, n)
        cout << p[i] << " \n"[i == n];
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 3584kb

input:

3
12 5
1 5
9 11
7 8
6 6
12 12
4 3
1 1
4 4
2 3
2 2
1 1
2 2

output:

0 1 2 3 4 1 1 7 1 9 10 1
2 0 2 2
IMPOSSIBLE

result:

ok Correct. (3 test cases)

Test #2:

score: 0
Accepted
time: 5ms
memory: 3968kb

input:

10
1 1
1 1
100000 1
1 100000
12 4
1 3
4 6
7 9
10 12
6 3
4 6
2 3
1 1
8999 3
1 3000
3001 6000
6001 8999
14 4
1 3
4 6
7 10
11 14
17 5
1 3
4 6
7 10
11 14
15 17
19999 2
1 9999
10000 19999
1 1
1 1
5 3
1 1
2 3
4 5

output:

0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 ...

result:

ok Correct. (10 test cases)

Test #3:

score: -100
Wrong Answer
time: 3ms
memory: 3840kb

input:

5
11 5
1 3
4 6
7 8
9 10
11 11
39998 4
1 10000
10001 20000
20001 30000
30001 39998
49000 5
1 10000
39999 49000
10001 20000
20001 30000
30001 39998
16 5
1 1
2 3
4 6
7 11
12 16
10 5
1 2
3 4
5 6
7 8
9 10

output:

IMPOSSIBLE
20001 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 9...

result:

wrong answer Case 1, jury find a solution while participant not. (test case 1)