1- /* *
2- * @file 6042.cpp
3- * @author Macesuted ([email protected] ) 4- * @date 2022-06-03
5- *
6- * @copyright Copyright (c) 2022
7- *
8- */
9-
10- #include < bits/stdc++.h>
11- using namespace std ;
12-
13- #ifndef LOCAL
14- #define endl ' \n '
15- #endif
16-
17- bool mem1;
18-
19- #define maxn 1000005
20-
21- typedef pair<int , int > pii;
22-
23- class SegmentTree {
24- private:
25- int sum[maxn << 2 ], cnt[maxn << 2 ], n;
26-
27- void pushUp (int p) { return sum[p] = sum[p << 1 ] + sum[p << 1 | 1 ], cnt[p] = cnt[p << 1 ] + cnt[p << 1 | 1 ], void (); }
28- void insert (int p, int l, int r, int qp, int v) {
29- if (l == r) return sum[p] += v * l, cnt[p] += v, void ();
30- int mid = (l + r) >> 1 ;
31- qp <= mid ? insert (p << 1 , l, mid, qp, v) : insert (p << 1 | 1 , mid + 1 , r, qp, v);
32- return pushUp (p);
33- }
34- pii query (int p, int l, int r, int v) {
35- if (l == r) {
36- int c = v / l + (v % l > 0 );
37- return {c, c * l};
38- }
39- int mid = (l + r) >> 1 ;
40- if (sum[p << 1 | 1 ] < v) {
41- pii ret = query (p << 1 , l, mid, v - sum[p << 1 | 1 ]);
42- return {ret.first + cnt[p << 1 | 1 ], ret.second + sum[p << 1 | 1 ]};
43- }
44- return query (p << 1 | 1 , mid + 1 , r, v);
45- }
46-
47- public:
48- void resize (int _n) { return n = _n, void (); }
49- void insert (int p, int v) { return insert (1 , 1 , n, p, v); }
50- pii query (int v) { return query (1 , 1 , n, v); }
51- };
52-
53- SegmentTree ST;
54- vector<int > graph[maxn];
55- int n, siz[maxn], ans[maxn];
56- multiset<int > S;
57-
58- pii dfs1 (int p, int pre = -1 ) {
59- pii ans = {0x3f3f3f3f , p};
60- siz[p] = 1 ;
61- int maxSon = 0 ;
62- for (auto i : graph[p])
63- if (i != pre ) ans = min (ans, dfs1 (i, p)), siz[p] += siz[i], maxSon = max (maxSon, siz[i]);
64- return min (ans, pii{max (maxSon, n - siz[p]), p});
65- }
66- void dfs2 (int p, int pre = -1 ) {
67- siz[p] = 1 ;
68- for (auto i : graph[p])
69- if (i != pre ) dfs2 (i, p), siz[p] += siz[i];
70- return ;
71- }
72-
73- void solve (void ) {
74- cin >> n;
75- for (int i = 1 , u, v; i < n; i++) cin >> u >> v, graph[u].push_back (v), graph[v].push_back (u);
76- ST.resize (n);
77- int root = dfs1 (1 ).second ;
78- dfs2 (root);
79- for (auto i : graph[root]) ST.insert (siz[i], +1 );
80- for (auto i : graph[root]) {
81- ST.insert (siz[i], -1 );
82- int cnt, sum;
83- tie (cnt, sum) = ST.query (n - siz[i] - n / 2 );
84- static queue<int > que;
85- que.push (i);
86- while (!que.empty ()) {
87- int p = que.front ();
88- que.pop ();
89- ans[p] = cnt + (n - siz[p] - sum > n / 2 );
90- for (auto i : graph[p])
91- if (!ans[i] && i != root) que.push (i);
92- }
93- ST.insert (siz[i], +1 );
94- }
95- for (int i = 1 ; i <= n; i++) cout << ans[i] << ' \n ' ;
96- return ;
97- }
98-
99- bool mem2;
100-
101- int main () {
102- ios::sync_with_stdio (false ), cin.tie (nullptr );
103- #ifdef LOCAL
104- cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
105- #endif
106-
107- int _ = 1 ;
108- while (_--) solve ();
109-
110- #ifdef LOCAL
111- cerr << " Time Cost: " << clock () * 1000 . / CLOCKS_PER_SEC << " MS" << endl;
112- #endif
113- return 0 ;
1+ /* *
2+ * @file 6042.cpp
3+ * @author Macesuted ([email protected] ) 4+ * @date 2022-06-03
5+ *
6+ * @copyright Copyright (c) 2022
7+ *
8+ */
9+
10+ #include < bits/stdc++.h>
11+ using namespace std ;
12+
13+ #ifndef LOCAL
14+ #define endl ' \n '
15+ #endif
16+
17+ bool mem1;
18+
19+ #define maxn 1000005
20+
21+ typedef pair<int , int > pii;
22+
23+ class SegmentTree {
24+ private:
25+ int sum[maxn << 2 ], cnt[maxn << 2 ], n;
26+
27+ void pushUp (int p) { return sum[p] = sum[p << 1 ] + sum[p << 1 | 1 ], cnt[p] = cnt[p << 1 ] + cnt[p << 1 | 1 ], void (); }
28+ void insert (int p, int l, int r, int qp, int v) {
29+ if (l == r) return sum[p] += v * l, cnt[p] += v, void ();
30+ int mid = (l + r) >> 1 ;
31+ qp <= mid ? insert (p << 1 , l, mid, qp, v) : insert (p << 1 | 1 , mid + 1 , r, qp, v);
32+ return pushUp (p);
33+ }
34+ pii query (int p, int l, int r, int v) {
35+ if (l == r) {
36+ int c = v / l + (v % l > 0 );
37+ return {c, c * l};
38+ }
39+ int mid = (l + r) >> 1 ;
40+ if (sum[p << 1 | 1 ] < v) {
41+ pii ret = query (p << 1 , l, mid, v - sum[p << 1 | 1 ]);
42+ return {ret.first + cnt[p << 1 | 1 ], ret.second + sum[p << 1 | 1 ]};
43+ }
44+ return query (p << 1 | 1 , mid + 1 , r, v);
45+ }
46+
47+ public:
48+ void resize (int _n) { return n = _n, void (); }
49+ void insert (int p, int v) { return insert (1 , 1 , n, p, v); }
50+ pii query (int v) { return query (1 , 1 , n, v); }
51+ };
52+
53+ SegmentTree ST;
54+ vector<int > graph[maxn];
55+ int n, siz[maxn], ans[maxn];
56+ multiset<int > S;
57+
58+ pii dfs1 (int p, int pre = -1 ) {
59+ pii ans = {0x3f3f3f3f , p};
60+ siz[p] = 1 ;
61+ int maxSon = 0 ;
62+ for (auto i : graph[p])
63+ if (i != pre ) ans = min (ans, dfs1 (i, p)), siz[p] += siz[i], maxSon = max (maxSon, siz[i]);
64+ return min (ans, pii{max (maxSon, n - siz[p]), p});
65+ }
66+ void dfs2 (int p, int pre = -1 ) {
67+ siz[p] = 1 ;
68+ for (auto i : graph[p])
69+ if (i != pre ) dfs2 (i, p), siz[p] += siz[i];
70+ return ;
71+ }
72+
73+ void solve (void ) {
74+ cin >> n;
75+ for (int i = 1 , u, v; i < n; i++) cin >> u >> v, graph[u].push_back (v), graph[v].push_back (u);
76+ ST.resize (n);
77+ int root = dfs1 (1 ).second ;
78+ dfs2 (root);
79+ for (auto i : graph[root]) ST.insert (siz[i], +1 );
80+ for (auto i : graph[root]) {
81+ ST.insert (siz[i], -1 );
82+ int cnt, sum;
83+ tie (cnt, sum) = ST.query (n - siz[i] - n / 2 );
84+ static queue<int > que;
85+ que.push (i);
86+ while (!que.empty ()) {
87+ int p = que.front ();
88+ que.pop ();
89+ ans[p] = cnt + (n - siz[p] - sum > n / 2 );
90+ for (auto i : graph[p])
91+ if (!ans[i] && i != root) que.push (i);
92+ }
93+ ST.insert (siz[i], +1 );
94+ }
95+ for (int i = 1 ; i <= n; i++) cout << ans[i] << ' \n ' ;
96+ return ;
97+ }
98+
99+ bool mem2;
100+
101+ int main () {
102+ ios::sync_with_stdio (false ), cin.tie (nullptr );
103+ #ifdef LOCAL
104+ cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
105+ #endif
106+
107+ int _ = 1 ;
108+ while (_--) solve ();
109+
110+ #ifdef LOCAL
111+ cerr << " Time Cost: " << clock () * 1000 . / CLOCKS_PER_SEC << " MS" << endl;
112+ #endif
113+ return 0 ;
114114}
0 commit comments