QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#78404#5403. 树数术541forever0 3481ms274164kbC++204.1kb2023-02-18 17:34:372023-02-18 17:34:40

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-02-18 17:34:40]
  • 评测
  • 测评结果:0
  • 用时:3481ms
  • 内存:274164kb
  • [2023-02-18 17:34:37]
  • 提交

answer

#include <bits/stdc++.h>
struct Tree {
	const int n;
	std::vector<std::vector<int>> e, st;
	std::vector<int> rnk, dfn, lg, rdfn;
	void DFS(int u, int fa) {
		static int dfx = 0;
		rnk[dfn[u] = ++dfx] = u;
		for (auto v : e[u])
			if (v != fa) {
				DFS(v, u);
				rnk[++dfx] = u;
			}
		rdfn[u] = dfx;
	}
	int Min(int x, int y) {
		return dfn[x] < dfn[y] ? x : y;
	}
	Tree(int n) : n(n), e(n), st(std::__lg(n << 1) + 1, std::vector<int>(n << 1 | 1)), rnk(n << 1 | 1), dfn(n), lg(n << 1 | 1, -1), rdfn(n, 1) {
		for (int i = 1, u, v; i < n; ++i) {
			std::cin >> u >> v;
			--u, --v;
			e[u].emplace_back(v);
			e[v].emplace_back(u);
		}
		DFS(0, -1);
		for (int i = 1; i <= (n << 1); ++i) lg[i] = lg[i >> 1] + 1;
		for (int i = 1; i <= (n << 1); ++i) st[0][i] = rnk[i];
		for (int i = 1; i <= lg[(n << 1) - 1]; ++i)
			for (int j = 1; j + (1 << i) - 1 <= (n << 1) - 1; ++j) {
				st[i][j] = Min(st[i - 1][j], st[i - 1][j + (1 << (i - 1))]);
			}
	}
	int LCA(int x, int y) {
		if (x == -1) return y;
		if (y == -1) return x;
		x = dfn[x], y = dfn[y];
		if (x > y) std::swap(x, y);
		int l = lg[y - x + 1];
		return Min(st[l][x], st[l][y - (1 << l) + 1]);
	}
	bool Sub(int x, int y) {
		return dfn[x] <= dfn[y] && dfn[y] <= rdfn[x];
	}
};
template<typename T>
class Fenwick {
	const int n;
	std::vector<T> a;
	T _Sum(int x) {
		T res = 0;
		for (; x; x -= x & (-x)) res += a[x];
		return res;
	}
public:
	Fenwick(int n = 0) : n(n), a(n + 1) {}
	void Add(int x, const T &v) {for (; x <= n; x += x & -x) a[x] += v;}
	T Sum(int l, int r) {return _Sum(r) - _Sum(l - 1);}
};
int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	int n, m, q;
	std::cin >> n >> m >> q;
	std::vector<std::vector<int>> e(n);
	Tree T(n);
	std::vector<int> a(m + 1), val(4 << std::__lg(m)), pre(m + 1);
	for (int i = 1; i <= m; ++i) std::cin >> a[i], --a[i];
	std::function<void(int, int, int)> Build = [&](int x, int l, int r) {
		if (l == r) return val[x] = a[l], void();
		int mid = (l + r) >> 1;
		Build(x << 1, l, mid), Build(x << 1 | 1, mid + 1, r);
		val[x] = T.LCA(val[x << 1], val[x << 1 | 1]);
	};
	Build(1, 1, m);
	auto Get = [m](int l, int r) {
		std::vector<std::tuple<int, int, int>> ans;
		std::function<void(int, int, int, int, int)> Split = [&](int x, int l, int r, int L, int R) {
			if (l > R || L > r) return;
			if (L <= l && r <= R) return ans.emplace_back(x, l, r), void();
			int mid = (l + r) >> 1;
			Split(x << 1, l, mid, L, R), Split(x << 1 | 1, mid + 1, r, L, R);
		};
		Split(1, 1, m, l, r);
		return ans;
	};
	for (int i = 1; i <= m; ++i) {
		auto cur = Get(1, i);
		std::reverse(cur.begin(), cur.end());
		int u = -1;
		for (auto [x, l, r] : cur) {
			if (T.Sub(a[i], T.LCA(val[x], u))) u = T.LCA(val[x], u), pre[i] = l;
			else {
				while (l < r) {
					if (T.Sub(a[i], T.LCA(u, val[x << 1 | 1]))) {
						x <<= 1;
						r = (l + r) >> 1;
						u = T.LCA(u, val[x << 1 | 1]);
					} else {
						l = ((l + r) >> 1) + 1;
						x = x << 1 | 1;
					}
				}
				pre[i] = l + 1;
				break;
			}
		}
	}
	std::vector<long long> ans(q, 1);
	std::vector<std::vector<std::pair<int, int>>> Q(m + 1);
	for (int k, i = 0; i < q; ++i) {
		std::cin >> k;
		int u = -1;
		for (int L, R; k--;) {
			std::cin >> L >> R;
			if (u == -1) u = a[L++];
			auto cur = Get(L, R);
			int v = -1, pt = L;
			for (auto [x, l, r] : cur) {
				if (!T.Sub(T.LCA(v, val[x]), u)) v = T.LCA(v, val[x]), pt = r + 1;
				else {
					while (l < r) {
						if (!T.Sub(T.LCA(v, val[x << 1]), u)) {
							x = x << 1 | 1;
							l = ((l + r) >> 1) + 1;
							v = T.LCA(v, val[x << 1]);
						} else {
							x <<= 1;
							r = (l + r) >> 1;
						}
					}
					assert(l==r);
					pt = l;
					break;
				}
			}
			for (auto [x, l, r] : cur) u = T.LCA(u, val[x]);
			Q[pt - 1].emplace_back(pt-1, q + i);
			Q[R].emplace_back(pt, i);
		}
	}
	Fenwick<long long> bit(m);
	for (int i = 1; i <= m; ++i) {
		bit.Add(pre[i], 1);
		for (auto [L, id] : Q[i])
			id >= q ? ans[id - q] -= bit.Sum(1, L) : ans[id] += bit.Sum(1, L);
	}
	for (auto c : ans) std::cout << c << '\n';
	return 0;
}

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 3481ms
memory: 274164kb

input:

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

output:

121987
141305
87432
42986
312556
194269
177810
454211
417130
299450
376629
227736
186417
163975
292497
216139
411977
16634
192685
27351
52127
55083
142169
275761
339876
117003
51132
229206
187647
353758
398455
83905
100992
350303
359211
60211
366172
164614
16903
222331
471095
184145
171049
240033
14...

result:

wrong answer 2nd lines differ - expected: '139520', found: '141305'

Subtask #2:

score: 0
Wrong Answer

Test #2:

score: 0
Wrong Answer
time: 2629ms
memory: 266156kb

input:

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

output:

211595
160846
176729
128253
32662
70710
74885
9095
68282
91324
154262
24279
31878
173468
75265
139715
91661
87525
194302
16876
81535
172911
29145
20484
151883
5255
9548
58890
38078
94152
14358
74859
48870
23982
41391
60976
13795
125824
427
26641
130620
174231
73241
55291
2364
78865
23391
4866
36005
...

result:

wrong answer 1st lines differ - expected: '211594', found: '211595'

Subtask #3:

score: 0
Wrong Answer

Test #3:

score: 0
Wrong Answer
time: 272ms
memory: 37576kb

input:

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

output:

9733
11331
8405
5136
22208
23231
12686
27288
23743
20947
18153
16380
8993
14039
11670
14687
20274
18956
21685
7930
21383
23578
14835
5714
15707
10013
7907
13255
13883
10446
16142
16796
11009
11914
15761
20419
11157
12192
14327
18261
19102
5240
4114
16525
7415
5005
16845
8747
19380
22600
12023
9163
9...

result:

wrong answer 2nd lines differ - expected: '11330', found: '11331'

Subtask #4:

score: 0
Skipped

Dependency #1:

0%