답안 #730030

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
730030 2023-04-25T05:42:07 Z pavement Unique Cities (JOI19_ho_t5) C++17
100 / 100
1345 ms 252052 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define int long long
#define mp make_pair
#define mt make_tuple
#define pb push_back
#define ppb pop_back
#define eb emplace_back
#define g0(a) get<0>(a)
#define g1(a) get<1>(a)
#define g2(a) get<2>(a)
#define g3(a) get<3>(a)
#define g4(a) get<4>(a)
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
using db = double;
using ll = long long;
using ld = long double;
using ii = pair<int, int>;
using iii = tuple<int, int, int>;
using iiii = tuple<int, int, int, int>;
using iiiii = tuple<int, int, int, int, int>;
template<class key, class value = null_type, class cmp = less<key> >
using ordered_set = tree<key, value, cmp, rb_tree_tag, tree_order_statistics_node_update>;

int N, M, lon[200005], ans_st[200005], ans_ed[200005], lon_st[200005], lon_ed[200005], dist_st[200005], dist_ed[200005], C[200005];
ii m = mp(-1, -1);
vector<int> adj[200005];
stack<int> rep[200005];

struct node {
	node *left, *right;
	int S, E, pv;
	ii val;
	void combine() {
		if (S == E) return;
		if (left->val.first == right->val.first) val = mp(left->val.first, left->val.second + right->val.second);
		else val = min(left->val, right->val);
	}
	node(int _s, int _e) : S(_s), E(_e), pv(0) {
		if (S == E) {
			val = mp(0, 1);
			return;
		}
		int M = (S + E) >> 1;
		left = new node(S, M);
		right = new node(M + 1, E);
		combine();
	}
	void prop() {
		if (S == E || !pv) return;
		left->val.first += pv;
		left->pv += pv;
		right->val.first += pv;
		right->pv += pv;
		pv = 0;
	}
	void upd(int l, int r, int v) {
		if (S == 0 && E == N - 1 && l <= r) {
			//~ cout << "+ " << l << ' ' << r << ' ' << v << '\n';
		}
		if (l > E || r < S) return;
		if (l <= S && E <= r) {
			val.first += v;
			pv += v;
			return;
		}
		prop();
		left->upd(l, r, v);
		right->upd(l, r, v);
		combine();
	}
	ii qry(int l, int r) {
		if (l > E || r < S) return mp((int)1e16, 0);
		if (l <= S && E <= r) return val;
		prop();
		auto lq = left->qry(l, r), rq = right->qry(l, r);
		if (lq.first == rq.first) return mp(lq.first, lq.second + rq.second);
		else return min(lq, rq);
	}
} *root;

void dfs(int n, int e = -1, int d = 0) {
	m = max(m, mp(d, n));
	for (auto u : adj[n]) if (u != e) {
		dfs(u, n, d + 1);
	}
}

void init(int n, int lon[], int dist[], int e = -1) {
	for (auto u : adj[n]) if (u != e) {
		dist[u] = dist[n] + 1;
		init(u, lon, dist, n);
		lon[n] = max(lon[n], lon[u]);
	}
	lon[n]++;
}

void get_ans(int n, int ans[], int lon[], int e = -1, int d = 0) {
	root->upd(d - lon[n] + 1, d - 1, 1);
	bool pushed = 0;
	if (rep[C[n]].empty() || root->qry(rep[C[n]].top(), rep[C[n]].top()).first) {
		rep[C[n]].push(d);
		pushed = 1;
		//~ cout << "PUSH " << n << '\n';
	} else {
		root->upd(d, d, 1);
	}
	auto tmp = root->qry(0, d);
	//~ cout << "COMPUTE " << n << ' ' << tmp.first << ' ' << tmp.second - pushed << '\n';
	for (int i = 0; i < N; i++) {
		//~ cout << !!root->qry(i, i).first;
	}
	//~ cout << '\n';
	ans[n] = (tmp.first ? 0ll : tmp.second - pushed);
	root->upd(d - lon[n] + 1, d - 1, -1);
	if (pushed) {
		assert(!rep[C[n]].empty() && rep[C[n]].top() == d);
		rep[C[n]].pop();
		//~ cout << "POP " << n << '\n';
	} else {
		root->upd(d, d, -1);
	}
	multiset<int> m;
	for (auto u : adj[n]) if (u != e) {
		m.insert(lon[u]);
	}
	for (auto u : adj[n]) if (u != e) {
		//~ cout << "AT " << u << '\n';
		m.erase(m.find(lon[u]));
		int x = (m.empty() ? 0ll : *m.rbegin());		
		root->upd(d - x, d - 1, 1);
		bool pushed = 0;
		if (rep[C[n]].empty() || root->qry(rep[C[n]].top(), rep[C[n]].top()).first) {
			rep[C[n]].push(d);
			pushed = 1;
			//~ cout << "PUSH " << n << '\n';
		} else {
			//~ cout << "DONTPUSH " << n << ' ' << rep[C[n]].top() << '\n';
			root->upd(d, d, 1);
		}
		get_ans(u, ans, lon, n, d + 1);
		root->upd(d - x, d - 1, -1);
		m.insert(lon[u]);
		if (pushed) {
			assert(!rep[C[n]].empty() && rep[C[n]].top() == d);
			rep[C[n]].pop();
			//~ cout << "POP " << n << '\n';
		} else {
			root->upd(d, d, -1);
		}
	}
}

main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> N >> M;
	for (int i = 1, u, v; i < N; i++) {
		cin >> u >> v;
		adj[u].pb(v);
		adj[v].pb(u);
	}
	for (int i = 1; i <= N; i++) {
		cin >> C[i];
	}
	dfs(1);
	int st = m.second;
	m = mp(-1, -1);
	dfs(st);
	int ed = m.second;
	root = new node(0, N - 1);
	init(st, lon_st, dist_st);
	get_ans(st, ans_st, lon_st);
	root = new node(0, N - 1);
	init(ed, lon_ed, dist_ed);
	for (int i = 1; i <= M; i++) {
		while (!rep[i].empty()) rep[i].pop();
	}
	get_ans(ed, ans_ed, lon_ed);
	for (int i = 1; i <= N; i++) {
		if (dist_st[i] <= dist_ed[i]) {
			cout << ans_ed[i] << '\n';
		} else {
			cout << ans_st[i] << '\n';
		}
	}
}

Compilation message

joi2019_ho_t5.cpp:157:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  157 | main() {
      | ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 80 ms 139596 KB Output is correct
2 Correct 83 ms 140388 KB Output is correct
3 Correct 83 ms 140180 KB Output is correct
4 Correct 82 ms 140520 KB Output is correct
5 Correct 85 ms 140416 KB Output is correct
6 Correct 86 ms 140756 KB Output is correct
7 Correct 85 ms 140512 KB Output is correct
8 Correct 86 ms 140428 KB Output is correct
9 Correct 86 ms 140356 KB Output is correct
10 Correct 86 ms 140484 KB Output is correct
11 Correct 85 ms 140416 KB Output is correct
12 Correct 82 ms 140464 KB Output is correct
13 Correct 87 ms 140792 KB Output is correct
14 Correct 85 ms 140588 KB Output is correct
15 Correct 87 ms 140472 KB Output is correct
16 Correct 84 ms 140424 KB Output is correct
17 Correct 84 ms 140672 KB Output is correct
18 Correct 85 ms 140624 KB Output is correct
19 Correct 83 ms 140356 KB Output is correct
20 Correct 85 ms 140748 KB Output is correct
21 Correct 84 ms 140492 KB Output is correct
22 Correct 92 ms 140392 KB Output is correct
23 Correct 90 ms 140492 KB Output is correct
24 Correct 84 ms 140468 KB Output is correct
25 Correct 85 ms 140348 KB Output is correct
26 Correct 84 ms 140428 KB Output is correct
27 Correct 85 ms 140620 KB Output is correct
28 Correct 86 ms 140628 KB Output is correct
29 Correct 84 ms 140600 KB Output is correct
30 Correct 85 ms 140520 KB Output is correct
31 Correct 87 ms 140596 KB Output is correct
32 Correct 83 ms 140592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 551 ms 180568 KB Output is correct
2 Correct 635 ms 203584 KB Output is correct
3 Correct 180 ms 152532 KB Output is correct
4 Correct 990 ms 211040 KB Output is correct
5 Correct 1163 ms 250512 KB Output is correct
6 Correct 1090 ms 230820 KB Output is correct
7 Correct 1000 ms 212640 KB Output is correct
8 Correct 1061 ms 216396 KB Output is correct
9 Correct 1031 ms 215016 KB Output is correct
10 Correct 1065 ms 214736 KB Output is correct
11 Correct 827 ms 220192 KB Output is correct
12 Correct 1182 ms 238972 KB Output is correct
13 Correct 1108 ms 233980 KB Output is correct
14 Correct 1174 ms 231564 KB Output is correct
15 Correct 879 ms 220888 KB Output is correct
16 Correct 1064 ms 240708 KB Output is correct
17 Correct 1074 ms 232940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 709 ms 196036 KB Output is correct
2 Correct 1031 ms 246348 KB Output is correct
3 Correct 191 ms 154248 KB Output is correct
4 Correct 879 ms 210824 KB Output is correct
5 Correct 1121 ms 251152 KB Output is correct
6 Correct 1170 ms 230604 KB Output is correct
7 Correct 866 ms 212284 KB Output is correct
8 Correct 971 ms 221124 KB Output is correct
9 Correct 947 ms 218096 KB Output is correct
10 Correct 950 ms 215164 KB Output is correct
11 Correct 828 ms 215436 KB Output is correct
12 Correct 1116 ms 245140 KB Output is correct
13 Correct 999 ms 231748 KB Output is correct
14 Correct 1102 ms 230800 KB Output is correct
15 Correct 860 ms 220708 KB Output is correct
16 Correct 1041 ms 240960 KB Output is correct
17 Correct 1027 ms 233084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 80 ms 139596 KB Output is correct
2 Correct 83 ms 140388 KB Output is correct
3 Correct 83 ms 140180 KB Output is correct
4 Correct 82 ms 140520 KB Output is correct
5 Correct 85 ms 140416 KB Output is correct
6 Correct 86 ms 140756 KB Output is correct
7 Correct 85 ms 140512 KB Output is correct
8 Correct 86 ms 140428 KB Output is correct
9 Correct 86 ms 140356 KB Output is correct
10 Correct 86 ms 140484 KB Output is correct
11 Correct 85 ms 140416 KB Output is correct
12 Correct 82 ms 140464 KB Output is correct
13 Correct 87 ms 140792 KB Output is correct
14 Correct 85 ms 140588 KB Output is correct
15 Correct 87 ms 140472 KB Output is correct
16 Correct 84 ms 140424 KB Output is correct
17 Correct 84 ms 140672 KB Output is correct
18 Correct 85 ms 140624 KB Output is correct
19 Correct 83 ms 140356 KB Output is correct
20 Correct 85 ms 140748 KB Output is correct
21 Correct 84 ms 140492 KB Output is correct
22 Correct 92 ms 140392 KB Output is correct
23 Correct 90 ms 140492 KB Output is correct
24 Correct 84 ms 140468 KB Output is correct
25 Correct 85 ms 140348 KB Output is correct
26 Correct 84 ms 140428 KB Output is correct
27 Correct 85 ms 140620 KB Output is correct
28 Correct 86 ms 140628 KB Output is correct
29 Correct 84 ms 140600 KB Output is correct
30 Correct 85 ms 140520 KB Output is correct
31 Correct 87 ms 140596 KB Output is correct
32 Correct 83 ms 140592 KB Output is correct
33 Correct 551 ms 180568 KB Output is correct
34 Correct 635 ms 203584 KB Output is correct
35 Correct 180 ms 152532 KB Output is correct
36 Correct 990 ms 211040 KB Output is correct
37 Correct 1163 ms 250512 KB Output is correct
38 Correct 1090 ms 230820 KB Output is correct
39 Correct 1000 ms 212640 KB Output is correct
40 Correct 1061 ms 216396 KB Output is correct
41 Correct 1031 ms 215016 KB Output is correct
42 Correct 1065 ms 214736 KB Output is correct
43 Correct 827 ms 220192 KB Output is correct
44 Correct 1182 ms 238972 KB Output is correct
45 Correct 1108 ms 233980 KB Output is correct
46 Correct 1174 ms 231564 KB Output is correct
47 Correct 879 ms 220888 KB Output is correct
48 Correct 1064 ms 240708 KB Output is correct
49 Correct 1074 ms 232940 KB Output is correct
50 Correct 709 ms 196036 KB Output is correct
51 Correct 1031 ms 246348 KB Output is correct
52 Correct 191 ms 154248 KB Output is correct
53 Correct 879 ms 210824 KB Output is correct
54 Correct 1121 ms 251152 KB Output is correct
55 Correct 1170 ms 230604 KB Output is correct
56 Correct 866 ms 212284 KB Output is correct
57 Correct 971 ms 221124 KB Output is correct
58 Correct 947 ms 218096 KB Output is correct
59 Correct 950 ms 215164 KB Output is correct
60 Correct 828 ms 215436 KB Output is correct
61 Correct 1116 ms 245140 KB Output is correct
62 Correct 999 ms 231748 KB Output is correct
63 Correct 1102 ms 230800 KB Output is correct
64 Correct 860 ms 220708 KB Output is correct
65 Correct 1041 ms 240960 KB Output is correct
66 Correct 1027 ms 233084 KB Output is correct
67 Correct 147 ms 149324 KB Output is correct
68 Correct 570 ms 188480 KB Output is correct
69 Correct 769 ms 196812 KB Output is correct
70 Correct 891 ms 211428 KB Output is correct
71 Correct 1165 ms 251068 KB Output is correct
72 Correct 1101 ms 230828 KB Output is correct
73 Correct 859 ms 212616 KB Output is correct
74 Correct 1096 ms 221308 KB Output is correct
75 Correct 1000 ms 216524 KB Output is correct
76 Correct 1012 ms 215624 KB Output is correct
77 Correct 798 ms 216904 KB Output is correct
78 Correct 1193 ms 243040 KB Output is correct
79 Correct 1066 ms 238860 KB Output is correct
80 Correct 1121 ms 230088 KB Output is correct
81 Correct 749 ms 220960 KB Output is correct
82 Correct 1082 ms 241048 KB Output is correct
83 Correct 1081 ms 233276 KB Output is correct
84 Correct 878 ms 211624 KB Output is correct
85 Correct 1200 ms 251688 KB Output is correct
86 Correct 1163 ms 231452 KB Output is correct
87 Correct 753 ms 212648 KB Output is correct
88 Correct 1099 ms 222156 KB Output is correct
89 Correct 1054 ms 217456 KB Output is correct
90 Correct 1024 ms 216264 KB Output is correct
91 Correct 748 ms 217236 KB Output is correct
92 Correct 1302 ms 250812 KB Output is correct
93 Correct 1156 ms 228936 KB Output is correct
94 Correct 1161 ms 224468 KB Output is correct
95 Correct 712 ms 221528 KB Output is correct
96 Correct 1099 ms 241696 KB Output is correct
97 Correct 1114 ms 233904 KB Output is correct
98 Correct 934 ms 212436 KB Output is correct
99 Correct 1345 ms 252052 KB Output is correct
100 Correct 1179 ms 232200 KB Output is correct
101 Correct 851 ms 213828 KB Output is correct
102 Correct 1043 ms 220360 KB Output is correct
103 Correct 976 ms 217632 KB Output is correct
104 Correct 1008 ms 216608 KB Output is correct
105 Correct 761 ms 218044 KB Output is correct
106 Correct 1259 ms 237860 KB Output is correct
107 Correct 1314 ms 239012 KB Output is correct
108 Correct 1098 ms 227240 KB Output is correct
109 Correct 871 ms 222124 KB Output is correct
110 Correct 1298 ms 242312 KB Output is correct
111 Correct 1194 ms 234524 KB Output is correct