QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#94741#3232. Daylightwhatever#100 ✓12081ms183920kbC++233.4kb2023-04-07 17:26:572023-04-07 17:27:00

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-04-07 17:27:00]
  • Judged
  • Verdict: 100
  • Time: 12081ms
  • Memory: 183920kb
  • [2023-04-07 17:26:57]
  • Submitted

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