QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#720029#9605. 新生舞会yyyyxh50 1662ms111604kbC++202.9kb2024-11-07 10:20:532024-11-07 10:20:53

Judging History

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

  • [2024-11-07 10:20:53]
  • 评测
  • 测评结果:50
  • 用时:1662ms
  • 内存:111604kb
  • [2024-11-07 10:20:53]
  • 提交

answer

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cstdio>
using namespace std;
const int N = 2000001;
int read() {
    char c = getchar();
    int x = 0;
    while (c < 48 || c > 57)
        c = getchar();
    do
        x = (x * 10) + (c ^ 48), c = getchar();
    while (c >= 48 && c <= 57);
    return x;
}
bitset<1 << 22> w;
int c[1 << 21];
int res, lim, bt, cb, dlt, nd;
int *g[N], f[N], s[N], d[N], n;
inline void upd(int x, int v) {
    c[x] += v;
    if (c[x] and c[x] == v) {
        int t = x + lim;
        while (t > 1 and w[t ^ 1])
            w.set(t), t >>= 1;
        w.set(t);
        return;
    }
    if (!c[x] and c[x] != v) {
        int t = x + lim;
        while (w[t])
            w.reset(t), t >>= 1;
        return;
    }
}
int sx[N], sv[N], tp;
inline void inc(int p, int cur) {
    cur ^= f[p];
    upd(cur, 1);
    for (int i = 0; i < d[p]; ++i)
        sx[tp] = g[p][i], sv[tp++] = cur;
}
inline void dec(int p, int cur) {
    cur ^= f[p];
    upd(cur, -1);
    for (int i = 0; i < d[p]; ++i)
        sx[tp] = g[p][i], sv[tp++] = cur;
}
int tx[N], ps[N];
bitset<N> tt;
int rk;
inline void sol(int p, bool del) {
    f[p] = 0;
    for (int i = 0; i < d[p]; ++i)
        f[p] ^= s[g[p][i]];
    for (int i = 1; i < d[p]; ++i) {
        inc(g[p][i], dlt);
        while (tp)
            --tp, inc(sx[tp], sv[tp]);
    }
    upd(dlt, 1);
    dlt ^= f[p];
    nd = 1, cb = bt;
    while (nd < lim) {
        --cb;
        nd = nd << 1 | (dlt >> cb & 1);
        if (w[nd])
            nd ^= 1;
    }
    nd -= lim;
    nd ^= dlt;
    f[p] ^= nd;
    dlt ^= nd;
    s[p] = nd;
    if (p == 1)
        res ^= nd;
    if (del) {
        dec(p, dlt);
        while (tp)
            --tp, dec(sx[tp], sv[tp]);
    }
}
inline void ca(int p, bool del) {
    int &t = ps[rk - 1];
    if (t > d[p])
        sol(p, del), --rk;
    else if (t == d[p])
        tx[rk] = g[p][0], ps[rk] = 1, tt[rk++] = 0, ++t;
    else
        tx[rk] = g[p][t], ps[rk] = 1, tt[rk++] = 1, ++t;
}
inline void solve() {
    n = read();
    dlt = 0, lim = 1, bt = 0;
    while (lim <= n)
        lim <<= 1, ++bt;
    for (int i = 2; i <= n; ++i)
        ++d[s[i] = read()];
    for (int i = 1; i <= n; ++i)
        g[i] = new int[d[i]], d[i] = 0;
    for (int i = 2; i <= n; ++i)
        g[s[i]][d[s[i]]++] = i;
    for (int i = n; i; --i) {
        s[i] = 1;
        for (int j = 0; j < d[i]; ++j) {
            s[i] += s[g[i][j]];
            if (s[g[i][0]] < s[g[i][j]])
                swap(g[i][0], g[i][j]);
        }
    }
    ps[0] = 1, tx[0] = 1, tt[0] = 1, rk = 1;
    while (rk)
        ca(tx[rk - 1], tt[rk - 1]);
    for (int i = 1; i <= n; ++i) {
        f[i] = d[i] = 0;
        delete[] g[i];
    }
}
int main() {
    int tc = read();
    while (tc--)
        solve();
    printf("%d\n", res);
    return 0;
}

详细

Subtask #1:

score: 10
Accepted

Test #1:

score: 10
Accepted
time: 0ms
memory: 18152kb

input:

12
13
1 2 1 4 2 5 3 3 2 9 6 4
392
1 2 2 4 4 3 3 6 9 10 9 11 13 14 15 15 17 18 19 20 6 21 23 12 24 26 27 28 29 30 31 32 33 31 34 33 36 9 38 40 41 25 42 44 45 46 47 48 49 50 51 52 53 21 32 52 54 58 59 60 53 61 63 64 65 66 67 68 69 70 4 1 71 74 75 76 77 78 79 80 81 52 82 55 84 86 84 87 89 90 91 92 93 1...

output:

1875

result:

ok 1 number(s): "1875"

Test #2:

score: 10
Accepted
time: 0ms
memory: 18404kb

input:

1
5000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 5 21 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 79 85 87 88 89 90 91 92 93 94 95 96 97 98 99 100 10...

output:

4950

result:

ok 1 number(s): "4950"

Test #3:

score: 10
Accepted
time: 0ms
memory: 20356kb

input:

1
5000
1 1 2 1 2 2 3 4 9 10 9 12 13 10 15 12 14 14 18 20 19 22 19 20 21 24 26 27 25 30 30 32 33 33 33 32 34 35 38 40 39 38 40 43 43 44 43 46 48 50 50 48 50 53 53 52 56 56 57 56 57 60 61 61 61 62 66 65 69 67 71 70 71 73 75 73 73 75 78 80 78 80 82 80 82 84 86 85 89 86 87 92 92 92 95 94 95 95 95 100 10...

output:

3204

result:

ok 1 number(s): "3204"

Subtask #2:

score: 10
Accepted

Test #4:

score: 10
Accepted
time: 1148ms
memory: 55544kb

input:

15
1
5
1 1 3 3
10603
1 2 2 1 5 3 6 3 2 7 6 6 10 5 4 16 4 16 18 4 11 22 8 14 2 26 22 9 10 20 28 26 1 27 8 35 3 4 6 25 14 9 33 44 15 26 28 34 24 18 48 5 33 11 37 32 19 14 41 6 46 60 8 25 62 32 59 27 54 50 62 44 51 18 53 46 42 31 26 11 78 71 40 60 2 13 35 84 34 76 51 88 33 13 88 85 80 70 21 74 54 79 75...

output:

11527

result:

ok 1 number(s): "11527"

Test #5:

score: 10
Accepted
time: 1662ms
memory: 111604kb

input:

1
2000000
1 1 1 4 5 5 3 6 4 1 11 2 11 4 15 11 11 11 1 16 11 15 22 6 7 23 4 5 8 2 27 1 5 3 15 30 30 21 34 28 22 24 25 33 45 13 1 46 27 27 39 15 42 44 38 27 52 39 27 58 36 37 29 34 30 44 29 55 17 60 34 30 61 29 61 13 12 67 70 9 67 40 54 72 14 80 42 27 49 88 12 2 53 8 57 93 74 22 22 85 61 79 89 55 23 1...

output:

16384

result:

ok 1 number(s): "16384"

Subtask #3:

score: 30
Accepted

Dependency #1:

100%
Accepted

Test #6:

score: 30
Accepted
time: 28ms
memory: 26532kb

input:

16
4
1 1 3
9
1 2 3 4 5 6 7 8
58
1 2 2 4 5 6 7 8 9 2 10 12 13 5 8 14 17 4 18 20 21 22 8 10 4 23 27 5 26 21 20 28 26 33 35 36 37 38 22 39 41 42 43 44 34 45 47 3 31 48 51 52 53 54 44 44 21
30
1 2 1 4 5 2 6 8 8 2 11 5 9 13 10 16 17 18 12 10 11 19 12 23 23 3 16 26 29
36
1 1 1 2 2 1 2 3 1 10 6 3 12 3 8 9 ...

output:

20841

result:

ok 1 number(s): "20841"

Test #7:

score: 30
Accepted
time: 27ms
memory: 27660kb

input:

1
200000
1 2 3 4 5 6 7 7 9 10 11 12 13 14 15 13 16 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...

output:

195053

result:

ok 1 number(s): "195053"

Test #8:

score: 30
Accepted
time: 35ms
memory: 30804kb

input:

1
200000
1 1 2 2 2 4 4 4 6 10 9 10 11 12 13 15 15 18 19 19 19 20 20 22 23 23 23 24 26 27 28 28 29 34 31 35 33 37 35 40 37 39 43 43 43 46 46 48 48 50 48 52 49 50 53 54 54 56 57 56 61 60 59 60 61 65 64 64 65 69 70 72 73 74 72 73 75 78 76 77 80 79 80 81 81 82 86 84 87 90 88 91 93 93 94 94 94 97 95 100 ...

output:

127754

result:

ok 1 number(s): "127754"

Test #9:

score: 30
Accepted
time: 18ms
memory: 26620kb

input:

1
200000
1 2 3 4 1 3 4 4 4 1 3 2 3 3 3 5 2 1 4 5 4 3 5 3 3 2 2 1 1 2 4 2 4 3 3 1 1 2 4 5 5 5 5 2 1 5 3 4 1 5 2 3 4 5 2 3 3 3 1 2 4 2 2 1 1 2 4 1 3 4 1 4 3 4 4 2 1 4 4 5 1 2 1 1 3 2 4 3 3 3 1 2 3 4 3 1 5 5 2 3 2 2 4 2 2 5 2 2 3 5 1 2 2 1 5 5 3 4 2 1 2 5 3 4 5 5 4 5 1 5 3 3 4 3 5 5 4 2 5 5 2 2 3 3 4 2...

output:

10

result:

ok 1 number(s): "10"

Test #10:

score: 30
Accepted
time: 38ms
memory: 24784kb

input:

1
200000
1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 ...

output:

66

result:

ok 1 number(s): "66"

Test #11:

score: 30
Accepted
time: 67ms
memory: 30668kb

input:

1
200000
1 2 2 1 5 3 2 7 4 1 5 10 2 3 15 16 13 1 12 13 19 13 19 16 23 9 10 1 23 26 30 7 25 16 25 36 16 27 10 39 40 20 6 5 30 3 46 41 35 30 24 28 28 8 38 25 32 38 29 21 56 17 24 38 5 7 62 58 13 8 11 45 47 55 55 12 64 8 55 7 5 31 73 20 85 83 44 74 58 65 57 66 27 47 66 56 90 39 96 15 37 14 30 61 96 73 ...

output:

8192

result:

ok 1 number(s): "8192"

Test #12:

score: 30
Accepted
time: 19ms
memory: 29316kb

input:

1
200000
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 25 62 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...

output:

199948

result:

ok 1 number(s): "199948"

Subtask #4:

score: 0
Memory Limit Exceeded

Dependency #1:

100%
Accepted

Dependency #2:

100%
Accepted

Dependency #3:

100%
Accepted

Test #13:

score: 50
Accepted
time: 912ms
memory: 93132kb

input:

13
397
1 2 3 1 4 4 6 2 8 10 11 12 13 5 14 16 17 18 19 20 17 21 7 23 25 26 18 16 22 11 27 18 28 32 35 36 17 37 39 40 28 17 41 23 44 16 13 13 46 50 51 16 16 52 55 56 21 57 59 38 28 9 18 60 65 22 66 68 69 70 71 72 73 9 74 76 77 78 79 80 81 25 82 84 25 85 87 88 51 89 91 87 92 94 95 42 96 98 59 99 101 10...

output:

523799

result:

ok 1 number(s): "523799"

Test #14:

score: 0
Memory Limit Exceeded

input:

1
2000000
1 1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 5 21 23 24 25 26 27 28 29 30 31 32 33 19 34 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 44 62 64 65 63 66 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 14 20 88 91 92 93 94 95 96 97 98 99 100...

output:

1949728

result: