QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#94741 | #3232. Daylight | whatever# | 100 ✓ | 12081ms | 183920kb | C++23 | 3.4kb | 2023-04-07 17:26:57 | 2023-04-07 17:27:00 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using u32 = unsigned int;
using u64 = unsigned long long;
constexpr int N = 2e5 + 10, L = 19;
int n, m, nn, fa[L][N], dep[N];
vector<int> G[N];
int jump(int u, int d) {
for(int i = 0; i < L; i ++) if(d >> i & 1) u = fa[i][u];
return u;
}
int lca(int u, int v) {
if(dep[u] < dep[v]) swap(u, v);
u = jump(u, dep[u] - dep[v]);
if(u == v) return u;
for(int i = L - 1; i >= 0; i --) if(fa[i][u] != fa[i][v]) u = fa[i][u], v = fa[i][v];
return fa[0][u];
}
void dfs(int u, int par) {
dep[u] = dep[par] + 1;
fa[0][u] = par;
for(int i = 1; i < L; i ++) fa[i][u] = fa[i - 1][fa[i - 1][u]];
for(auto v : G[u]) if(v != par) {
dfs(v, u);
}
}
int vis[N], sz[N], mx[N], rt, all;
vector<tuple<int, int, int>> par[N];
vector<int> dis[N][2];
void findrt(int u, int par) {
mx[u] = 0, sz[u] = 1;
for(auto v : G[u]) if(v != par && !vis[v]) {
findrt(v, u);
mx[u] = max(mx[u], sz[v]);
sz[u] += sz[v];
}
mx[u] = max(mx[u], all - sz[u]);
if(mx[u] < mx[rt]) rt = u;
}
void solve(int u) {
vis[u] = 1;
vector<int> s;
dis[u][0].assign(all + 1, 0);
if(u <= nn) {
dis[u][0][0] ++;
}
par[u].emplace_back(u, 0, 0);
for(auto v : G[u]) if(!vis[v]) {
findrt(v, u), all = sz[v];
rt = 0, findrt(v, u);
dis[rt][1].assign(all + 1, 0);
function<void(int, int, int)> dfs = [&] (int x, int fa, int dep) {
if(x <= nn) {
dis[u][0][dep] ++;
dis[rt][1][dep] ++;
}
par[x].emplace_back(u, 0, dep);
par[x].emplace_back(rt, 1, dep);
for(auto y : G[x]) if(!vis[y] && y != fa) {
dfs(y, x, dep + 1);
}
};
dfs(v, u, 1);
solve(rt);
}
}
int calc(int x, int d1) {
int ans = 0;
for(auto [y, o, d2] : par[x]) {
int r = d1 - d2;
if(r >= 0){
if(!o) ans += r < dis[y][0].size() ? dis[y][0][r] : dis[y][0].back();
else ans -= r < dis[y][1].size() ? dis[y][1][r] : dis[y][1].back();
}
}
return ans;
}
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0);
int T;
for(cin >> T; T; T --) {
cin >> n >> m; nn = n;
for(int i = 1; i < n; i ++) {
int u, v; cin >> u >> v;
int w = n + i;
G[u].emplace_back(w);
G[w].emplace_back(u);
G[v].emplace_back(w);
G[w].emplace_back(v);
}
n += n - 1;
dfs(1, 1);
mx[0] = n, all = n, rt = 0, findrt(1, 1);
for(int i = 1; i <= n; i ++) {
par[i].reserve(2 * L);
}
solve(rt);
for(int i = 1; i <= n; i ++) {
for(int j = 1; j < dis[i][0].size(); j ++) dis[i][0][j] += dis[i][0][j - 1];
for(int j = 1; j < dis[i][1].size(); j ++) dis[i][1][j] += dis[i][1][j - 1];
}
int lastans = 0;
for(int i = 0; i < m; i ++) {
int u, v, d;
cin >> u >> v >> d;
u = (u + lastans) % nn + 1;
v = (v + lastans) % nn + 1;
d = (d + lastans) % nn;
int ans = calc(u, 2 * d) + calc(v, 2 * d);
int w = lca(u, v), len = dep[u] + dep[v] - 2 * dep[w];
assert(len % 2 == 0);
int l = len / 2;
if(dep[u] - dep[w] >= l) {
ans -= calc(jump(u, l), 2 * d - l);
} else {
ans -= calc(jump(v, l), 2 * d - l);
}
cout << (lastans = ans)<< '\n';
}
for(int i = 1; i <= n; i ++) {
G[i].clear();
vis[i] = 0;
dis[i][0].clear(), dis[i][1].clear();
par[i].clear();
G[i].shrink_to_fit();
dis[i][0].shrink_to_fit();
dis[i][1].shrink_to_fit();
par[i].shrink_to_fit();
}
cerr << 1.0 * clock() / CLOCKS_PER_SEC << '\n';
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 12081ms
memory: 183920kb
input:
100 100000 100000 67672 73429 73429 62807 36128 73429 73429 97696 26524 73429 94290 73429 30735 73429 51707 73429 73429 52862 29620 73429 73429 951 31570 73429 73429 93564 13195 73429 37473 73429 38853 73429 73871 73429 31884 73429 61635 73429 73429 74144 74632 73429 73429 34214 63517 73429 11989 73...
output:
3 3 3 3 3 2 3 3 2 3 3 2 2 3 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 3 3 3 3 2 3 3 2 3 2 2 3 3 3 3 2 3 3 2 3 2 2 2 3 2 3 3 2 3 2 3 3 2 3 3 2 2 3 3 3 2 2 2 3 3 3 3 3 3 2 3 2 2 3 3 3 3 3 2 2 3 2 3 2 2 3 2 3 3 3 2 2 3 3 2 3 3 2 2 3 2 2 3 2 2 2 3 3 3 2 3 2 2 2 3 3 2 2 3 2 2 3 2 2 2 3 3 3 2 2 3 3 3 3 3 2 2 2 3 ...
result:
ok 1088007 lines