QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#412102#3171. Rooted Subtreesivan_len#RE 0ms3836kbC++202.0kb2024-05-16 08:10:372024-05-16 08:10:37

Judging History

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

  • [2024-05-16 08:10:37]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:3836kb
  • [2024-05-16 08:10:37]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
#define PB push_back
#define MP make_pair
#define A first
#define B second
#define SZ(x) int(x.size())
#define FR(i, a, b) for (int i = (a); i < (b); ++i)
#define FOR(i, n) FR(i, 0, n)
const int M = 1000000007;
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());

int n, q;
vector<vi> e;
vector<vi> lca;
vi p, d;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> q;
    e.resize(n);
    FOR(i, n - 1) {
        int u, v;
        cin >> u >> v;
        u--; v--;
        e[u].PB(v);
        e[v].PB(u);
    }
    lca.resize(20, vi(n, -1));
    p.resize(n); d.resize(n);
    function<void(int, int)> dfs = [&](int u, int pre) {
        p[u] = pre;
        if (u) d[u] = d[pre] + 1;
        for (auto v : e[u]) {
            if (v == pre) continue;
            dfs(v, u);
        }
    };
    dfs(0, -1);
    FOR(i, 20) {
        FOR(j, n) {
            if (i == 0) {
                if (d[j] >= (1 << i)) lca[i][j] = p[j];
                continue;
            }
            if (d[j] >= (1 << i)) lca[i][j] = lca[i - 1][lca[i - 1][j]];
        }
    }
    auto get_lca = [&](int u, int v) {
        if (d[u] > d[v]) swap(u, v);
        int dist = d[v] - d[u];
        FOR(i, 20) {
            if ((dist >> i) & 1) v = lca[i][v];
        }
        if (u == v) return u;
        int acc = 0;
        FOR(i, 20) {
            if (lca[i][v] != lca[i][u]) {
                v = lca[i][v];
                u = lca[i][u];
            }
        }
        assert(lca[0][v] == lca[0][u]);
        return lca[0][v];
    };
    FOR(i, q) {
        int l, r;
        cin >> l >> r;
        l--; r--;
        int t = get_lca(l, r);
        ll cnt = 0;
        cnt = d[l] + d[r] - 2 * d[t] + 1;
        ll ans = (ll)n - cnt + ((cnt + 1) * cnt) / 2;
        cout << ans << '\n';
    }
}

詳細信息

Test #1:

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

input:

5 2
1 2
2 3
2 4
4 5
1 3
4 5

output:

8
6

result:

ok 2 lines

Test #2:

score: -100
Runtime Error

input:

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

output:


result: