Skip to content

Commit 1c61910

Browse files
committed
Add gitattributes and enfore LF
1 parent 9c0e9bc commit 1c61910

File tree

2 files changed

+114
-113
lines changed

2 files changed

+114
-113
lines changed

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* text eol=lf

LibreOJ/6042.cpp

Lines changed: 113 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,114 +1,114 @@
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

Comments
 (0)