QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#412102 | #3171. Rooted Subtrees | ivan_len# | RE | 0ms | 3836kb | C++20 | 2.0kb | 2024-05-16 08:10:37 | 2024-05-16 08:10:37 |
Judging History
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';
}
}
Details
Tip: Click on the bar to expand more detailed information
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...