UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#204781#3620. ATony210018009ms98368kbC++114.8kb2024-06-09 11:51:102024-06-09 13:13:43

answer

/*

Even with one's eyes closed, heaven is there.

As long as heaven is lodged in,
there is no way to avert your gaze
from what you wish not to see.

Meaning, you may only see
what it wants you to see.

Even though one's eyes were closed,
one's sight remained open.

It will be forever impossible to close.

*/
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 3e5 + 5;
int n, q, srt[N];
vector<int> e[N];
int fa[N], de[N], sz[N], son[N];
int top[N], dfsnum, dfn[N], rev[N];
ll a[N];
set<pair<int, int>> st[N];
void dfs1(int u){
	sz[u] = 1;
	for (int v : e[u])
		if (v != fa[u]){
			fa[v] = u;
			de[v] = de[u] + 1;
			dfs1(v);
			sz[u] += sz[v];
			if (sz[v] > sz[son[u]])
				son[u] = v;
		}
}
void dfs2(int u){
	rev[dfn[u] = ++dfsnum] = u;
	if (son[u]){
		top[son[u]] = top[u];
		dfs2(son[u]);
	}
	for (int v : e[u])
		if (v != fa[u] && v != son[u]){
			top[v] = v;
			dfs2(v);
		}
}
void dfs3(int u){
	st[u].insert({sz[u], u});
	for (int v : e[u])
		if (v != fa[u]){
			dfs3(v);
			if (st[u].size() < st[v].size()) swap(st[u], st[v]);
			for (pair<int, int> p : st[v]) st[u].insert(p);
			st[v].clear();
		}
	while (st[u].begin()->first * 2 <= sz[u]) st[u].erase(st[u].begin());
	srt[u] = st[u].begin()->second;
}
int kfa(int u, int k){
	k = de[u] - k;
	while (de[top[u]] - 1 >= k) u = fa[top[u]];
	return rev[dfn[u] - (de[u] - k)];
}
int lca(int u, int v){
	while (top[u] != top[v]){
		if (de[top[u]] < de[top[v]]) swap(u, v);
		u = fa[top[u]];
	}
	return de[u] < de[v] ? u : v;
}
vector<pair<int, int>> getpath(int u, int v){
	vector<pair<int, int>> res;
	while (top[u] != top[v]){
		if (de[top[u]] < de[top[v]]) swap(u, v);
		res.emplace_back(dfn[top[u]], dfn[u]);
		u = fa[top[u]];
	}
	if (dfn[u] > dfn[v]) swap(u, v);
	res.emplace_back(dfn[u], dfn[v]);
	return res;
}
struct tree{
	ll a[N];
	void add(int x, ll k){
		for (; x <= n; x += x & -x) a[x] += k;
	}
	ll ask(int x){
		ll res = 0;
		for (; x; x -= x & -x) res += a[x];
		return res;
	}
}T, Ts, Td;
void add(int l, int r, ll k){
	T.add(l, k);
	T.add(r + 1, -k);
}
void addsz(int l, int r, ll k){
	Ts.add(l, k);
	Ts.add(r + 1, -k);
}
void addde(int l, int r, ll k){
	Td.add(l, k);
	Td.add(r + 1, -k);
}
ll ask(int u){
	return T.ask(dfn[u]) + Td.ask(dfn[u]) * de[u] + Ts.ask(dfn[u]) * sz[u];
}
int step(int u){
	if (ask(1) <= 0) return 1;
	if (u > 1 && ask(u) <= 0){
		while (top[u] != 1 && ask(top[u]) <= 0) u = fa[top[u]];
		int l = dfn[top[u]], r = dfn[u], mid;
		while (l <= r){
			mid = (l + r) >> 1;
			if (ask(rev[mid]) <= 0) r = mid - 1;
			else l = mid + 1;
		}
		u = rev[r];
	}
	return u;
}
int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
	cin >> n >> q;
	for (int i = 1; i < n; i++){
		int u, v;
		cin >> u >> v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs1(1);
	top[1] = 1;
	dfs2(1);
	dfs3(1);
	int ans = 1;
	while (q--){
		int opt, u, val, mid;
		cin >> opt >> u;
		if (opt == 1){
			mid = srt[u];
			cin >> val;
			add(1, dfn[u] - 1, -1ll * sz[u] * val);
			if (u > 1){
				vector<pair<int, int>> vec = getpath(1, fa[u]);
				for (pair<int, int> p : vec){
					int l = p.first, r = p.second;
					add(l, r, 2ll * sz[u] * val);
				} 
			}
			add(dfn[u], dfn[u] + sz[u] - 1, -1ll * sz[u] * val);
			addsz(dfn[u], dfn[u] + sz[u] - 1, 2 * val);
			add(dfn[u] + sz[u], n, -1ll * sz[u] * val);
		}else{
			int v;
			cin >> v >> val;
			int l = lca(u, v), len = de[u] + de[v] - 2 * de[l] + 1;
			if (len & 1) mid = kfa(de[u] > de[v] ? u : v, len / 2);
			else mid = kfa(de[u] > de[v] ? u : v, len / 2);
			add(1, dfn[l], -1ll * len * val);
			vector<pair<int, int>> vec = getpath(1, l);
			for (pair<int, int> p : vec){
				int l2 = p.first, r2 = p.second;
				add(l2, r2, 2ll * len * val);
			}
			add(dfn[l] + 1, dfn[l] + sz[l] - 1, -1ll * len * val);
			if (u != l){
				vec = getpath(u, kfa(u, de[u] - de[l] - 1));
				for (pair<int, int> p : vec){
					int l2 = p.first, r2 = p.second;
					add(l2, r2, 2ll * (de[u] + 1) * val);
					addde(l2, r2, -2 * val);
				}
			}
			if (v != l){
				vec = getpath(v, kfa(v, de[v] - de[l] - 1));
				for (pair<int, int> p : vec){
					int l2 = p.first, r2 = p.second;
					add(l2, r2, 2ll * (de[v] + 1) * val);
					addde(l2, r2, -2 * val);
				}
			}
			add(dfn[l] + sz[l], n, -1ll * len * val);
		}
//		for (int i = 2; i <= n; i++) cout << ask(i) << ' ';
//		cout << endl;
		ans = step(ans);
		mid = step(mid);
		if (de[mid] > de[ans]) ans = mid;
		cout << ans << endl;
//		pair<int, int> mx(-1, 1);
//		for (int i = 2; i <= n; i++)
//			if (ask(i) > 0)
//				mx = max(make_pair(de[i], i), mx);
//		cout << mx.second << endl;
	}
	return 0;
}

详细

小提示:点击横条可展开更详细的信息

Subtask #1:

score: 10
Accepted

Test #1:

score: 10
Accepted
time: 19ms
memory: 22844kb

input:

1631 1695
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...

output:

1303
721
688
701
682
737
588
628
713
769
774
780
862
866
871
886
909
929
937
943
941
946
945
954
949...

result:

ok 1695 lines

Test #2:

score: 0
Accepted
time: 21ms
memory: 22592kb

input:

1724 1881
2 1
3 2
4 2
5 2
6 1
7 6
8 2
9 8
10 6
11 10
12 1
13 1
14 12
15 7
16 3
17 14
18 13
19 4
20 8...

output:

910
910
910
910
910
910
910
910
910
910
910
910
826
826
826
826
826
826
1006
1006
1006
1006
1006
100...

result:

ok 1881 lines

Test #3:

score: 0
Accepted
time: 12ms
memory: 22592kb

input:

1935 1603
2 1
3 2
4 3
5 1
6 1
7 2
8 6
9 1
10 1
11 8
12 11
13 10
14 4
15 2
16 9
17 8
18 14
19 14
20 7...

output:

14
2
10
1
1
1
1
1
1
1
1
1
1
1
1
2
2
2
2
1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
1
1
1
1
1
1
1
...

result:

ok 1603 lines

Test #4:

score: 0
Accepted
time: 22ms
memory: 22584kb

input:

1782 1942
2 1
3 1
4 2
5 4
6 1
7 1
8 1
9 7
10 4
11 5
12 10
13 4
14 7
15 14
16 15
17 3
18 5
19 16
20 1...

output:

14
7
7
7
4
4
4
4
4
1
1
7
1
4
4
4
4
4
4
2
1
1
4
2
2
2
2
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1...

result:

ok 1942 lines

Subtask #2:

score: 20
Accepted

Test #5:

score: 20
Accepted
time: 1546ms
memory: 94988kb

input:

281495 252939
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
1...

output:

213578
210748
135169
135026
144651
132400
134957
124141
118451
118781
137612
154321
170613
166113
17...

result:

ok 252939 lines

Test #6:

score: 0
Accepted
time: 1706ms
memory: 92984kb

input:

273746 287587
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
1...

output:

189163
189918
190785
185592
183371
184857
188261
186057
186098
184608
193692
178813
178667
179002
17...

result:

ok 287587 lines

Test #7:

score: 0
Accepted
time: 1438ms
memory: 86280kb

input:

247712 269003
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
1...

output:

176247
185709
162271
169277
173592
171721
153484
155588
162688
163154
161122
160221
154947
154853
14...

result:

ok 269003 lines

Test #8:

score: 0
Accepted
time: 1477ms
memory: 98368kb

input:

294554 246011
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
1...

output:

225125
191067
199412
203257
197830
189818
184048
184192
183424
180181
180167
185337
187207
185668
18...

result:

ok 246011 lines

Subtask #3:

score: 30
Accepted

Test #9:

score: 30
Accepted
time: 1409ms
memory: 94076kb

input:

286640 284270
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
1...

output:

257488
195036
211947
235498
241668
232198
232766
228649
228553
208960
201281
202100
202317
203208
20...

result:

ok 284270 lines

Test #10:

score: 0
Accepted
time: 1494ms
memory: 43108kb

input:

260280 269761
2 1
3 1
4 2
5 4
6 5
7 2
8 3
9 6
10 7
11 1
12 7
13 3
14 9
15 3
16 11
17 13
18 2
19 14
2...

output:

180457
180457
171997
177266
159775
159174
159174
159174
232429
232429
146084
146084
146084
146084
14...

result:

ok 269761 lines

Test #11:

score: 0
Accepted
time: 1235ms
memory: 46152kb

input:

299939 243207
2 1
3 1
4 2
5 1
6 5
7 5
8 1
9 3
10 8
11 1
12 9
13 8
14 11
15 5
16 13
17 11
18 14
19 16...

output:

289736
289736
8
5
1
1
1
1
1
1
9190
9190
9190
9190
9190
9190
9190
9190
9190
9190
9190
9190
9190
9190
...

result:

ok 243207 lines

Test #12:

score: 0
Accepted
time: 1146ms
memory: 43084kb

input:

260657 248813
2 1
3 1
4 1
5 4
6 5
7 1
8 5
9 5
10 5
11 1
12 9
13 11
14 6
15 12
16 10
17 12
18 16
19 1...

output:

192653
115832
172896
11
5
190178
32264
32264
9
9
9
9
12
12
12
12
3992
3992
3992
3992
3992
3992
3992
...

result:

ok 248813 lines

Subtask #4:

score: 40
Accepted

Test #13:

score: 40
Accepted
time: 1357ms
memory: 84632kb

input:

241289 290298
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
1...

output:

198749
185755
175529
192379
192636
183414
183546
173058
171195
154762
156345
166238
164292
163728
15...

result:

ok 290298 lines

Test #14:

score: 0
Accepted
time: 1946ms
memory: 48272kb

input:

295796 290103
2 1
3 1
4 2
5 1
6 1
7 6
8 4
9 8
10 2
11 5
12 4
13 4
14 3
15 12
16 2
17 10
18 1
19 14
2...

output:

70561
125326
125326
133092
125326
125326
125326
125326
125326
125326
125326
133092
133092
133092
125...

result:

ok 290103 lines

Test #15:

score: 0
Accepted
time: 1661ms
memory: 45788kb

input:

268550 291961
2 1
3 2
4 1
5 1
6 3
7 3
8 3
9 3
10 2
11 4
12 6
13 12
14 12
15 3
16 1
17 14
18 6
19 1
2...

output:

223475
1
2
2
2
4435
4435
4435
4435
2716
2716
2716
2716
2716
2716
2716
2716
2716
2716
2716
2716
2716
...

result:

ok 291961 lines

Test #16:

score: 0
Accepted
time: 1520ms
memory: 47396kb

input:

287030 275087
2 1
3 1
4 1
5 4
6 3
7 6
8 6
9 3
10 5
11 9
12 8
13 1
14 4
15 10
16 1
17 5
18 11
19 12
2...

output:

18
9
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
712...

result:

ok 275087 lines

Extra Test:

score: 0
Extra Test Passed