Skip to content

Commit c6c292f

Browse files
committed
Petrozavodsk Winter 2022. Day 5. Yandex Cup
1 parent ae374d4 commit c6c292f

3 files changed

Lines changed: 242 additions & 0 deletions

File tree

QOJ/2596.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/**
2+
* @file 2596.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-10-29
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
15+
#define maxn 1000005
16+
17+
using pii = pair<int, int>;
18+
19+
vector<int> graph[maxn];
20+
int f[maxn][3];
21+
22+
void dfs(int p, int pre = -1) {
23+
vector<int> rec[2];
24+
int sum = 0;
25+
26+
for (auto q : graph[p]) {
27+
if (q == pre) continue;
28+
dfs(q, p);
29+
sum += f[q][2];
30+
if (f[q][0] != INT_MAX) rec[0].push_back(f[q][0] - f[q][2]);
31+
if (f[q][1] != INT_MAX) rec[1].push_back(f[q][1] - f[q][2]);
32+
}
33+
sort(rec[0].begin(), rec[0].end()), sort(rec[1].begin(), rec[1].end());
34+
35+
f[p][0] = f[p][1] = f[p][2] = INT_MAX;
36+
if (rec[1].size() >= 0) {
37+
f[p][0] = sum;
38+
for (size_t i = 0; i < rec[1].size() && rec[1][i] < 0; i++) f[p][0] += rec[1][i];
39+
}
40+
if (rec[0].size() >= 1) {
41+
f[p][1] = sum + rec[0][0];
42+
for (size_t i = 1; i < rec[0].size() && rec[0][i] < 0; i++) f[p][1] += rec[0][i];
43+
}
44+
45+
if (rec[0].size() >= 2) {
46+
int val = 1 + sum + rec[0][0] + rec[0][1];
47+
for (size_t i = 2; i < rec[0].size() && rec[0][i] < 0; i++) val += rec[0][i];
48+
f[p][2] = min(f[p][2], val);
49+
}
50+
if (rec[1].size() >= 0) {
51+
int val = 1 + sum;
52+
for (size_t i = 0; i < rec[1].size() && rec[1][i] < 0; i++) val += rec[1][i];
53+
f[p][2] = min(f[p][2], val);
54+
}
55+
56+
return;
57+
}
58+
59+
void solve(void) {
60+
int n;
61+
cin >> n;
62+
for (int i = 1, x, y; i < n; i++) cin >> x >> y, graph[x].push_back(y), graph[y].push_back(x);
63+
64+
if (n <= 2) return cout << n - 1 << endl, void();
65+
66+
int root = 1;
67+
while (graph[root].size() == 1) root++;
68+
69+
dfs(root);
70+
71+
cout << f[root][2] - 1 << endl;
72+
73+
return;
74+
}
75+
76+
int main() {
77+
ios::sync_with_stdio(false), cin.tie(nullptr);
78+
79+
int _ = 1;
80+
while (_--) solve();
81+
82+
return 0;
83+
}

QOJ/2598.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* @file 2598.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-10-29
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
15+
void solve(void) {
16+
int n;
17+
cin >> n;
18+
19+
if (n == 1) return cout << "NO" << endl, void();
20+
21+
vector<vector<int>> a(1 << n, vector<int>(1 << n));
22+
23+
for (int i = 0, cnt = 0; i < (1 << n); i++)
24+
for (int j = 0; j < (1 << n); j++) a[i][j] = ++cnt;
25+
26+
for (int i = 0; i < (1 << n); i += 2)
27+
for (int j = 0; j < (1 << (n - 1)); j++) swap(a[i][j], a[i][j | (1 << (n - 1))]);
28+
29+
for (int i = 0; i < (1 << (n - 1)); i++)
30+
for (int j = 0; j < (1 << n); j += 2) swap(a[i][j], a[i | (1 << (n - 1))][j]);
31+
32+
cout << "YES" << endl;
33+
for (int i = 0; i < (1 << n); i++) {
34+
for (int j = 0; j < (1 << n); j++) cout << a[i][j] << ' ';
35+
cout << endl;
36+
}
37+
38+
return;
39+
}
40+
41+
int main() {
42+
ios::sync_with_stdio(false), cin.tie(nullptr);
43+
44+
int _ = 1;
45+
while (_--) solve();
46+
47+
return 0;
48+
}

QOJ/2602.cpp

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/**
2+
* @file 2602.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-10-29
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
15+
#define maxn 300005
16+
17+
using pii = pair<int, int>;
18+
19+
class SegmentTree {
20+
private:
21+
int sum[maxn << 2], val[maxn << 2];
22+
int n;
23+
24+
void pushUp(int p) {
25+
sum[p] = sum[p << 1] + sum[p << 1 | 1];
26+
val[p] = min(val[p << 1] + sum[p << 1 | 1], val[p << 1 | 1]);
27+
return;
28+
}
29+
void build(int p, int l, int r) {
30+
if (l == r) return sum[p] = +1, val[p] = 0, void();
31+
int mid = (l + r) >> 1;
32+
build(p << 1, l, mid), build(p << 1 | 1, mid + 1, r);
33+
return pushUp(p);
34+
}
35+
void update(int p, int l, int r, int qp, int v) {
36+
if (l == r) return val[p] = min(0, sum[p] += v), void();
37+
int mid = (l + r) >> 1;
38+
qp <= mid ? update(p << 1, l, mid, qp, v) : update(p << 1 | 1, mid + 1, r, qp, v);
39+
return pushUp(p);
40+
}
41+
42+
public:
43+
void resize(int _n) { return n = _n, void(); }
44+
void build(void) { return build(1, 1, n); }
45+
void update(int p, int v) { return update(1, 1, n, p, v); }
46+
int query(void) { return val[1]; }
47+
} SGT;
48+
49+
vector<pii> ins[maxn], del[maxn];
50+
vector<int> pos[maxn];
51+
int vmax[maxn][2];
52+
bool mark[maxn];
53+
54+
void solve(void) {
55+
int n, m;
56+
cin >> n >> m;
57+
58+
for (int i = 1, c, l, r; i <= m; i++) cin >> c >> l >> r, ins[l].emplace_back(c, i), del[r].emplace_back(c, i);
59+
60+
multiset<pii> S;
61+
for (int i = 1; i <= n; i++) {
62+
for (auto v : ins[i]) S.insert(v);
63+
64+
vmax[i][0] = vmax[i][1] = 1;
65+
if (S.size() >= 1) vmax[i][0] = S.rbegin()->first, pos[S.rbegin()->second].push_back(i);
66+
if (S.size() >= 2) vmax[i][1] = next(S.rbegin())->first;
67+
68+
for (auto v : del[i]) S.erase(S.find(v));
69+
}
70+
71+
SGT.resize(n), SGT.build();
72+
73+
for (int i = 1; i <= n; i++) SGT.update(vmax[i][0], -1);
74+
75+
auto check = [&](void) -> void {
76+
if (SGT.query() != 0) return;
77+
78+
set<int> S;
79+
for (int i = 1; i <= n; i++) S.insert(i);
80+
81+
cout << "YES" << endl;
82+
for (int i = 1; i <= n; i++) {
83+
auto p = S.lower_bound(vmax[i][mark[i]]);
84+
cout << *p << ' ', S.erase(p);
85+
}
86+
cout << endl;
87+
88+
exit(0);
89+
};
90+
91+
check();
92+
93+
for (int i = 1; i <= m; i++) {
94+
for (auto p : pos[i]) mark[p] = true, SGT.update(vmax[p][0], +1), SGT.update(vmax[p][1], -1);
95+
check();
96+
for (auto p : pos[i]) mark[p] = false, SGT.update(vmax[p][0], -1), SGT.update(vmax[p][1], +1);
97+
}
98+
99+
cout << "NO" << endl;
100+
101+
return;
102+
}
103+
104+
int main() {
105+
ios::sync_with_stdio(false), cin.tie(nullptr);
106+
107+
int _ = 1;
108+
while (_--) solve();
109+
110+
return 0;
111+
}

0 commit comments

Comments
 (0)