QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#502793#7245. Frank SinatraRainPPRTL 195ms18488kbC++234.2kb2024-08-03 14:21:132024-08-03 14:21:19

Judging History

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

  • [2024-08-03 14:21:19]
  • 评测
  • 测评结果:TL
  • 用时:195ms
  • 内存:18488kb
  • [2024-08-03 14:21:13]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

constexpr int N = 2e5 + 10;

// -----------------------------------------------------------------------------

int n, m;

vector<int> s;

#define get_id(x) ({ lower_bound(s.begin(), s.end(), (x)) - s.begin() + 1; })

struct edge {
    int v, w;
    edge() = default;
    edge(int v, int w): v(v), w(w) {}
};

vector<edge> g[N];

int col[N];

// -----------------------------------------------------------------------------

int dfs[2 * N], tot;
int st[N], ed[N];

namespace hld {
    int fa[N], son[N];
    int dep[N], siz[N];
    int top[N];

    void dfs1(int u, int ff) {
        dfs[++tot] = u, st[u] = tot;
        siz[u] = 1, son[u] = -1;
        int mx = -1;
        for (auto t : g[u]) {
            int v = t.v;
            if (v == ff) continue;
            col[v] = get_id(t.w);
            fa[v] = u, dep[v] = dep[u] + 1;
            dfs1(v, u), siz[u] += siz[v];
            if (siz[v] > mx) mx = siz[v], son[u] = v;
        }
        dfs[++tot] = u, ed[u] = tot;
    }

    void dfs2(int u, int tp) {
        top[u] = tp;
        if (son[u] == -1) return;
        dfs2(son[u], tp);
        for (auto t : g[u]) {
            if (t.v == fa[u]) continue;
            if (t.v == son[u]) continue;
            dfs2(t.v, t.v);
        }
    }
}

int lca(int u, int v) {
    while (hld::top[u] != hld::top[v]) {
        if (hld::dep[hld::top[u]] > hld::dep[hld::top[v]])
            u = hld::fa[hld::top[u]];
        else v = hld::fa[hld::top[v]];
    }
    return hld::dep[u] < hld::dep[v] ? u : v;
}

// -----------------------------------------------------------------------------

int block1, belong1[2 * N];

struct query {
    int id, l, r, lca;
    friend bool operator <(const query &a, const query &b) {
        if (belong1[a.l] != belong1[b.l]) return a.l < b.l;
        return belong1[a.l] & 1 ? a.r < b.r : a.r > b.r;
    }
} q[N];

// -----------------------------------------------------------------------------

bool vis[2 * N];

int block, cnt;
int belong[N], L[N], R[N];
int bucket[N], appr[N];

void add(int x) {
    if (!bucket[x]) ++appr[belong[x]];
    ++bucket[x];
}

void del(int x) {
    --bucket[x];
    if (!bucket[x]) --appr[belong[x]];
}

int get_ans() {
    int inner = 1;
    while (inner <= cnt && appr[inner] == R[inner] - L[inner] + 1) ++inner;
    for (int i = L[inner]; i <= R[inner]; ++i) if (!bucket[i]) return i;
    return n + 1;
}

void calc(int x) {
    if (vis[x]) del(col[x]);
    else add(col[x]);
    vis[x] ^= 1;
}

// -----------------------------------------------------------------------------

int ans[N];

signed main() {
    cin >> n >> m;
    // 预处理值域分块
    block = sqrt(n), cnt = (n - 1) / block + 1;
    for (int i = 1; i <= n; ++i) belong[i] = (i - 1) / block + 1;
    for (int i = 1; i <= cnt; ++i) R[i] = i * block, L[i] = R[i] - block + 1;
    R[cnt] = n;
    // 操作离线
    for (int i = 2; i <= n; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].emplace_back(v, w);
        g[v].emplace_back(u, w);
        s.push_back(w);
    }
    sort(s.begin(), s.end());
    s.erase(unique(s.begin(), s.end()), s.end());
    s.push_back(s.back() + 1);
    // 轻重链剖分
    hld::dfs1(1, -1);
    hld::dfs2(1, 1);
    for (int i = 1; i <= m; ++i) {
        int u, v;
        cin >> u >> v;
        if (st[u] > st[v]) swap(u, v);
        int l = lca(u, v);
        if (l == u) q[i] = query{i, st[u], st[v], l};
        else q[i] = query{i, ed[u], st[v], -1};
    }
    block1 = max(1, int(tot / sqrt(m * 2 / 3.0)));
    for (int i = 1; i <= tot; ++i) belong1[i] = (i - 1) / block1 + 1;
    // sort(q + 1, q + m + 1);
    // 莫队算法
    int l = 1, r = 0;
    for (int i = 1; i <= m; ++i) {
        int x = q[i].l, y = q[i].r;
        while (x < l) calc(dfs[--l]);
        while (y > r) calc(dfs[++r]);
        while (x > l) calc(dfs[l++]);
        while (y < r) calc(dfs[r--]);
        if (q[i].lca != -1) calc(q[i].lca);
        ans[q[i].id] = get_ans();
        if (q[i].lca != -1) calc(q[i].lca);
    }
    for (int i = 1; i <= m; ++i)
        cout << s[ans[i] - 1] << endl;
    return 0;
}

詳細信息

Test #1:

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

input:

7 6
2 1 1
3 1 2
1 4 0
4 5 1
5 6 3
5 7 4
1 3
4 1
2 4
2 5
3 5
3 7

output:

0
1
2
2
3
3

result:

ok 6 numbers

Test #2:

score: 0
Accepted
time: 2ms
memory: 13804kb

input:

2 4
1 2 0
1 1
1 2
2 1
2 2

output:

0
1
1
0

result:

ok 4 number(s): "0 1 1 0"

Test #3:

score: 0
Accepted
time: 0ms
memory: 13800kb

input:

10 100
3 7 1
3 1 0
6 1 1
1 9 0
4 1 1
5 8 1
10 6 0
1 2 1
5 3 1
6 1
4 10
6 5
3 3
5 8
9 2
1 3
8 4
8 5
10 10
5 2
7 10
2 10
8 9
5 3
9 4
6 2
1 8
4 7
3 9
2 5
3 7
10 7
2 2
6 6
6 7
1 9
7 8
6 8
7 3
5 10
5 1
1 2
10 8
8 7
4 2
2 3
7 6
2 9
5 4
10 3
2 4
10 6
3 6
7 4
5 6
10 4
8 2
1 4
9 10
7 9
3 5
9 8
7 2
1 1
7 1
7 ...

output:

0
2
2
0
0
2
1
2
0
0
2
2
2
2
0
2
0
2
2
1
2
0
2
0
0
2
1
0
2
0
2
2
0
2
0
0
2
2
2
2
2
0
1
2
2
2
2
2
0
2
2
0
2
2
0
2
0
2
0
2
2
2
2
2
1
2
2
1
2
0
0
2
2
0
0
2
2
2
2
0
2
0
2
0
2
0
0
0
0
1
2
0
2
0
1
2
2
2
2
2

result:

ok 100 numbers

Test #4:

score: 0
Accepted
time: 0ms
memory: 17916kb

input:

10 100
8 1 1
9 1 1
4 1 0
1 3 1
1 6 0
1 2 0
5 1 1
7 1 1
10 1 1
3 7
3 9
7 9
1 4
2 4
5 9
10 7
9 3
7 4
8 10
6 10
1 8
9 4
10 10
10 2
5 6
7 6
8 4
7 3
7 8
3 5
10 5
1 10
8 9
1 1
8 3
10 6
5 10
8 1
6 6
8 2
6 4
5 4
8 8
1 5
5 3
8 7
1 2
4 6
7 1
2 8
2 2
5 5
7 2
5 7
1 7
6 1
2 3
5 8
3 2
10 1
1 3
7 10
7 5
1 9
6 3
5 ...

output:

0
0
0
1
1
0
0
0
2
0
2
0
2
0
2
2
2
2
0
0
0
0
0
0
0
0
2
0
0
0
2
1
2
0
0
0
0
1
1
0
2
0
0
2
0
0
1
2
0
2
0
0
0
0
0
2
0
2
1
2
2
2
0
2
0
2
2
2
0
2
0
2
1
2
0
1
2
0
0
2
0
2
0
2
0
0
2
0
0
1
0
1
0
2
1
2
2
2
2
0

result:

ok 100 numbers

Test #5:

score: 0
Accepted
time: 2ms
memory: 13864kb

input:

10 100
6 7 0
7 10 0
9 2 0
8 9 0
3 4 1
5 8 0
3 10 0
1 5 0
4 2 0
6 5
10 10
5 4
6 4
6 9
6 2
2 5
5 10
9 3
2 4
9 1
2 9
1 2
7 9
10 6
6 6
3 9
4 6
7 8
8 2
8 4
6 8
4 1
5 5
10 7
1 1
1 4
7 3
5 8
10 2
8 1
8 8
1 8
2 10
3 7
9 4
8 9
4 10
3 6
10 8
3 2
10 3
8 5
10 1
4 9
5 6
3 4
9 8
10 5
6 1
9 7
4 4
10 9
9 5
3 1
1 10...

output:

2
0
1
2
2
2
1
2
2
1
1
1
1
2
1
0
2
2
2
1
1
2
1
0
1
0
1
1
1
2
1
0
1
2
1
1
1
2
1
2
2
1
1
2
1
2
0
1
2
2
2
0
2
1
2
2
1
2
1
2
2
1
2
2
0
1
2
1
2
0
2
1
1
2
2
2
0
1
1
1
1
2
2
1
1
1
2
2
2
0
1
0
2
1
2
2
2
2
1
2

result:

ok 100 numbers

Test #6:

score: 0
Accepted
time: 131ms
memory: 16228kb

input:

316 99856
173 102 0
290 81 1
209 299 0
96 16 0
254 48 1
107 173 0
288 102 1
130 94 1
280 152 0
293 187 1
270 76 1
18 301 0
33 136 1
179 212 1
181 60 1
134 129 0
81 240 1
180 132 1
33 296 1
81 14 0
240 184 0
235 42 0
200 70 0
4 259 1
230 244 0
284 252 1
230 236 0
187 216 1
177 305 1
70 28 1
21 279 0
...

output:

2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
0
...

result:

ok 99856 numbers

Test #7:

score: 0
Accepted
time: 141ms
memory: 18432kb

input:

316 99856
15 21 1
152 21 0
58 21 0
200 21 0
21 267 0
227 21 1
21 72 1
21 270 1
21 28 0
172 21 1
26 21 1
21 257 0
90 21 1
21 134 0
21 46 1
53 21 1
21 31 0
124 21 1
21 312 0
110 21 0
189 21 1
21 150 1
178 21 0
265 21 1
21 165 0
54 21 0
21 35 0
97 21 1
102 21 0
21 96 1
161 21 1
66 21 1
21 127 1
16 21 0...

output:

2
2
2
2
1
2
1
1
2
1
0
2
2
2
2
1
0
2
2
2
2
0
2
0
0
2
1
1
2
2
2
2
0
1
1
1
1
1
1
0
0
0
2
2
2
0
2
2
1
2
1
1
1
1
1
1
1
1
1
2
0
2
2
0
1
1
2
2
0
0
2
1
2
2
0
2
0
0
2
0
2
1
0
2
2
1
2
1
0
1
2
2
2
2
2
2
2
1
1
2
2
2
2
2
2
2
1
0
1
0
1
2
0
1
1
0
0
2
2
2
2
1
1
2
1
2
2
0
2
0
1
1
2
1
1
2
1
2
2
1
2
0
2
2
1
2
2
2
0
2
...

result:

ok 99856 numbers

Test #8:

score: 0
Accepted
time: 102ms
memory: 16348kb

input:

316 99856
192 178 1
279 42 0
304 261 0
47 100 0
282 142 0
122 238 1
295 236 1
128 265 1
124 291 0
299 19 1
144 164 1
113 131 0
206 50 0
242 294 1
7 258 0
22 220 1
5 239 0
270 263 1
156 14 1
66 22 0
254 271 1
295 12 0
69 87 0
302 33 0
4 56 1
34 204 0
168 285 1
98 116 1
50 223 1
205 154 1
145 73 0
84 ...

output:

2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
0
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
0
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
1
2
2
2
2
2
2
2
2
2
2
2
0
2
2
2
2
2
2
2
0
2
2
2
2
2
2
2
...

result:

ok 99856 numbers

Test #9:

score: 0
Accepted
time: 162ms
memory: 18376kb

input:

316 99856
173 234 1
290 158 2
143 299 2
74 16 0
254 88 0
107 187 1
288 68 2
234 94 0
280 39 0
293 219 0
270 63 0
286 301 0
181 136 1
179 199 2
221 60 1
9 129 1
143 240 1
206 132 2
33 81 1
81 79 0
313 184 2
235 187 1
200 163 2
148 259 1
230 223 0
189 252 2
204 236 1
284 216 0
259 305 0
124 28 2
21 29...

output:

3
3
3
3
3
1
3
3
3
0
3
3
3
3
3
3
2
3
3
3
3
3
3
1
3
3
3
3
2
3
3
3
3
1
3
0
3
3
3
3
3
3
3
3
0
3
3
3
3
3
3
3
0
2
1
1
3
3
3
1
3
1
0
3
1
3
3
3
3
3
3
3
1
3
3
3
3
3
0
3
3
1
3
3
3
1
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
0
3
3
3
3
3
0
3
3
3
3
3
3
3
3
1
1
3
3
3
0
0
0
3
3
3
3
3
1
0
3
0
3
3
3
3
3
2
3
0
...

result:

ok 99856 numbers

Test #10:

score: 0
Accepted
time: 137ms
memory: 18488kb

input:

316 99856
15 21 1
152 21 1
58 21 1
200 21 1
21 267 1
227 21 1
21 72 0
21 270 1
21 28 1
172 21 2
26 21 2
21 257 2
90 21 0
21 134 0
21 46 1
53 21 2
21 31 2
124 21 2
21 312 1
110 21 2
189 21 2
21 150 1
178 21 1
265 21 0
21 165 2
54 21 2
21 35 2
97 21 1
102 21 2
21 96 0
161 21 1
66 21 2
21 127 0
16 21 0...

output:

2
0
0
0
0
2
0
2
2
1
1
0
0
0
0
0
0
1
1
1
2
2
2
0
1
0
0
1
0
0
0
0
2
0
1
0
1
0
0
0
0
0
1
0
2
0
0
1
1
1
0
1
0
0
1
2
0
0
2
0
2
1
0
1
1
2
0
0
2
1
1
1
2
1
2
1
1
1
0
2
0
0
0
2
2
2
0
1
0
2
0
0
1
1
0
1
0
1
2
0
1
1
0
0
1
0
0
2
0
1
1
0
2
1
0
0
2
0
0
1
2
2
0
2
1
0
1
1
1
0
0
1
1
0
0
2
0
1
0
0
0
1
0
0
0
1
0
2
1
2
...

result:

ok 99856 numbers

Test #11:

score: 0
Accepted
time: 102ms
memory: 16412kb

input:

316 99856
192 178 1
279 42 0
304 261 0
47 100 2
282 142 1
122 238 2
295 236 0
128 265 2
124 291 0
299 19 2
144 164 1
113 131 1
206 50 0
242 294 2
7 258 0
22 220 2
5 239 2
270 263 2
156 14 0
66 22 1
254 271 2
295 12 2
69 87 2
302 33 1
4 56 1
34 204 1
168 285 1
98 116 0
50 223 2
205 154 2
145 73 1
84 ...

output:

3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
1
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
1
3
3
3
3
0
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
2
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
0
3
3
3
3
3
3
3
3
3
3
3
3
3
3
0
3
3
0
3
3
3
3
3
3
3
3
1
3
3
3
3
3
3
3
0
3
3
3
3
3
3
3
...

result:

ok 99856 numbers

Test #12:

score: 0
Accepted
time: 195ms
memory: 16376kb

input:

316 99856
173 193 2
290 193 3
249 299 3
91 16 2
254 306 3
107 6 1
288 63 3
75 94 3
280 1 0
293 105 1
270 42 0
255 301 2
188 136 0
179 234 3
288 60 2
48 129 0
76 240 3
186 132 1
33 1 2
81 187 3
77 184 0
235 48 3
200 11 2
211 259 0
230 24 2
36 252 3
306 236 0
310 216 0
68 305 2
43 28 3
21 192 3
196 16...

output:

4
4
1
4
1
3
4
0
4
4
4
2
4
4
4
4
4
1
4
4
4
4
1
4
4
4
4
4
0
4
4
1
4
4
4
4
0
0
4
4
4
4
4
4
1
0
4
1
0
1
4
1
0
4
1
4
4
0
3
3
0
1
4
0
4
3
4
2
4
1
4
1
0
4
4
4
3
1
4
4
1
4
4
1
4
4
4
4
1
2
4
1
4
4
4
4
1
4
4
4
0
4
0
3
1
4
1
1
4
4
1
4
4
4
4
1
1
2
2
2
4
1
4
4
1
4
3
1
4
4
1
1
2
4
0
4
1
0
4
4
4
4
4
4
2
1
0
3
4
0
...

result:

ok 99856 numbers

Test #13:

score: 0
Accepted
time: 140ms
memory: 16344kb

input:

316 99856
15 21 2
152 21 0
58 21 3
200 21 3
21 267 2
227 21 1
21 72 1
21 270 1
21 28 0
172 21 0
26 21 2
21 257 3
90 21 0
21 134 2
21 46 0
53 21 3
21 31 1
124 21 3
21 312 3
110 21 1
189 21 2
21 150 3
178 21 1
265 21 0
21 165 0
54 21 1
21 35 0
97 21 0
102 21 0
21 96 3
161 21 0
66 21 0
21 127 0
16 21 2...

output:

0
1
0
0
0
0
1
1
0
2
0
0
2
0
1
0
1
0
0
1
0
0
0
0
2
0
2
1
0
1
0
1
2
0
0
0
1
0
1
1
0
0
0
0
2
1
0
2
0
0
1
0
2
0
0
0
0
0
2
1
2
1
0
0
1
0
1
0
1
1
0
0
1
0
1
0
1
2
0
0
2
0
0
1
1
1
2
0
0
0
1
1
0
0
1
0
0
1
0
0
1
1
0
0
2
0
0
1
1
1
2
0
0
1
1
0
0
1
0
0
2
1
1
0
0
0
0
0
0
1
0
0
0
1
0
0
2
2
0
1
0
0
0
0
0
2
0
0
0
1
...

result:

ok 99856 numbers

Test #14:

score: 0
Accepted
time: 94ms
memory: 18488kb

input:

316 99856
192 178 1
279 42 0
304 261 2
47 100 2
282 142 2
122 238 0
295 236 0
128 265 0
124 291 2
299 19 1
144 164 3
113 131 1
206 50 2
242 294 3
7 258 0
22 220 2
5 239 3
270 263 2
156 14 1
66 22 2
254 271 1
295 12 1
69 87 3
302 33 1
4 56 2
34 204 2
168 285 3
98 116 0
50 223 3
205 154 3
145 73 3
84 ...

output:

4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
0
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
0
4
4
4
4
0
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
0
4
4
4
4
4
4
4
4
4
0
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
0
4
4
1
4
4
4
4
4
4
4
4
0
4
4
4
4
4
4
4
1
4
4
4
4
4
4
4
...

result:

ok 99856 numbers

Test #15:

score: -100
Time Limit Exceeded

input:

100000 100000
16002 62285 0
94338 15156 0
16232 69491 0
78830 42791 0
42291 79934 0
25280 42281 0
43246 84026 0
81015 59152 0
26228 85524 0
77807 16621 0
87239 27802 0
45572 68749 0
46470 21413 0
91385 31600 0
39840 65919 0
63409 52046 0
61637 45889 0
96346 70771 0
21432 11753 0
38616 69335 0
32943 ...

output:


result: