Skip to content

Commit b54e4fb

Browse files
committed
Petrozavodsk Winter 2025. Day 3. K-ontest 1
1 parent 860c471 commit b54e4fb

4 files changed

Lines changed: 270 additions & 1 deletion

File tree

QOJ/10537.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,6 @@ int main() {
101101
#ifdef LOCAL
102102
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
103103
#endif
104-
return 0
104+
105+
return 0;
106+
}

QOJ/10867.cpp

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/**
2+
* @file 10867.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-10-10
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 250005
16+
17+
class SegmentTree {
18+
private:
19+
int a[maxn << 2], n;
20+
21+
void pushDown(int p) {
22+
if (!a[p]) return;
23+
a[p << 1] = max(a[p << 1], a[p]), a[p << 1 | 1] = max(a[p << 1 | 1], a[p]);
24+
a[p] = 0;
25+
return;
26+
}
27+
void insert(int p, int l, int r, int qp) {
28+
if (l == r) return a[p] = 0, void();
29+
pushDown(p);
30+
int mid = (l + r) >> 1;
31+
return qp <= mid ? insert(p << 1, l, mid, qp) : insert(p << 1 | 1, mid + 1, r, qp);
32+
}
33+
int erase(int p, int l, int r, int qp) {
34+
if (l == r) return a[p];
35+
pushDown(p);
36+
int mid = (l + r) >> 1;
37+
return qp <= mid ? erase(p << 1, l, mid, qp) : erase(p << 1 | 1, mid + 1, r, qp);
38+
}
39+
void update(int p, int l, int r, int ql, int qr, int v) {
40+
if (ql <= l && r <= qr) return a[p] = max(a[p], v), void();
41+
pushDown(p);
42+
int mid = (l + r) >> 1;
43+
if (ql <= mid) update(p << 1, l, mid, ql, qr, v);
44+
if (qr > mid) update(p << 1 | 1, mid + 1, r, ql, qr, v);
45+
return;
46+
}
47+
48+
public:
49+
void resize(int _n) { return n = _n, void(); }
50+
void insert(int p) { return insert(1, 1, n, p); }
51+
int erase(int p) { return erase(1, 1, n, p); }
52+
void update(int l, int r, int v) { return update(1, 1, n, l, r, v); }
53+
} SGT;
54+
55+
int a[maxn], dep[maxn], fa[maxn], son[maxn], top[maxn], siz[maxn], dfni[maxn], ans[maxn];
56+
vector<int> t1[maxn], t2[maxn];
57+
58+
void dfs1(int p, int pre = 0) {
59+
siz[p] = 1, fa[p] = pre;
60+
for (auto q : t2[p])
61+
if (q != pre) {
62+
dep[q] = dep[p] + 1, dfs1(q, p), siz[p] += siz[q];
63+
if (!son[p] || siz[q] > siz[son[p]]) son[p] = q;
64+
}
65+
return;
66+
}
67+
int dfnt = 0;
68+
void dfs2(int p, int t) {
69+
dfni[p] = ++dfnt, top[p] = t;
70+
if (son[p]) dfs2(son[p], t);
71+
for (auto q : t2[p])
72+
if (q != son[p] && q != fa[p]) dfs2(q, q);
73+
return;
74+
}
75+
void dfs3(int p, int pre = 0) {
76+
SGT.insert(dfni[p]);
77+
78+
int x = p;
79+
while (top[x] != 1) SGT.update(dfni[top[x]], dfni[x], a[p]), x = fa[top[x]];
80+
SGT.update(1, dfni[x], a[p]);
81+
82+
for (auto q : t1[p])
83+
if (q != pre) dfs3(q, p);
84+
85+
ans[p] = SGT.erase(dfni[p]);
86+
87+
return;
88+
}
89+
90+
void solve(void) {
91+
int n;
92+
cin >> n;
93+
for (int i = 1; i <= n; i++) cin >> a[i];
94+
for (int i = 1, x, y; i < n; i++) cin >> x >> y, t1[x].push_back(y), t1[y].push_back(x);
95+
for (int i = 1, x, y; i < n; i++) cin >> x >> y, t2[x].push_back(y), t2[y].push_back(x);
96+
97+
dfs1(1);
98+
dfs2(1, 1);
99+
100+
SGT.resize(n);
101+
102+
dfs3(1);
103+
104+
for (int i = 1; i <= n; i++) cout << ans[i] << endl;
105+
106+
return;
107+
}
108+
109+
int main() {
110+
ios::sync_with_stdio(false), cin.tie(nullptr);
111+
112+
int _ = 1;
113+
while (_--) solve();
114+
115+
return 0;
116+
}

QOJ/10868.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* @file 10868.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-10-10
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+
int f[maxn];
18+
19+
void solve(void) {
20+
int n;
21+
string s;
22+
cin >> n >> s;
23+
for (int i = 1; i <= n; i++) f[i] = f[i - 1] + (s[i - 1] == 'H');
24+
25+
for (int i = 1; i <= n; i++) {
26+
int p = 0, ans = 0;
27+
while (i + f[p] <= n && p < i + f[p]) p = i + f[p], ans++;
28+
cout << ans << ' ';
29+
}
30+
cout << endl;
31+
32+
return;
33+
}
34+
35+
int main() {
36+
ios::sync_with_stdio(false), cin.tie(nullptr);
37+
38+
int _ = 1;
39+
while (_--) solve();
40+
41+
return 0;
42+
}

QOJ/10874.cpp

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
/**
2+
* @file 10874.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-10-10
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 500005
16+
17+
using pli = pair<int64_t, int>;
18+
19+
int h[2][maxn], f[maxn], indeg[maxn], id[maxn];
20+
bool valid[maxn], vis[maxn];
21+
vector<int> graph[maxn];
22+
23+
void solve(void) {
24+
vector<int64_t> pos;
25+
vector<pli> poss[2];
26+
pos.push_back(0);
27+
for (int t = 0, m; t < 2; t++) {
28+
cin >> m;
29+
int64_t pre = 0;
30+
for (int i = 1, w, h; i <= m; i++) cin >> w >> h, pos.push_back(pre += w), poss[t].emplace_back(pre, h);
31+
}
32+
33+
sort(pos.begin(), pos.end());
34+
int n = unique(pos.begin(), pos.end()) - pos.begin() - 1;
35+
36+
for (int t = 1; ~t; t--)
37+
for (int j = 1, k = 0; j <= n; j++) {
38+
while (poss[t][k].first < pos[j]) k++;
39+
h[t][j] = poss[t][k].second, id[j] = k + 1;
40+
}
41+
42+
for (int i = 1; i <= n; i++) valid[i] = (h[0][i] == h[1][i]);
43+
44+
f[0] = INT_MAX;
45+
for (int i = 1; i <= n; i++) {
46+
f[i] = min(f[i - 1], h[1][i]);
47+
if (h[0][i] == f[i])
48+
f[i] = INT_MAX;
49+
else
50+
valid[i] = false;
51+
}
52+
53+
f[n + 1] = INT_MAX;
54+
for (int i = n; i >= 1; i--) {
55+
f[i] = min(f[i + 1], h[1][i]);
56+
if (h[0][i] == f[i])
57+
f[i] = INT_MAX;
58+
else
59+
valid[i] = false;
60+
}
61+
62+
for (int i = 1; i <= n; i++) {
63+
if (!h[1][i]) continue;
64+
if (i - 1 >= 1 && h[1][i - 1] <= h[1][i]) graph[i].push_back(i - 1), indeg[i - 1]++;
65+
if (i + 1 <= n && h[1][i + 1] <= h[1][i]) graph[i].push_back(i + 1), indeg[i + 1]++;
66+
}
67+
68+
vector<int> nodes;
69+
for (int i = 1; i <= n; i++)
70+
if (valid[i] && h[1][i]) nodes.push_back(i);
71+
sort(nodes.begin(), nodes.end(), [&](int x, int y) { return h[1][x] > h[1][y]; });
72+
73+
vector<int> ans;
74+
for (auto p : nodes) {
75+
if (vis[p]) continue;
76+
77+
ans.push_back(p);
78+
vis[p] = true;
79+
80+
for (int i = p - 1, v = h[0][p]; i >= 1 && !vis[i] && h[1][i]; i--)
81+
if ((v = min(v, h[0][i])) == h[1][i])
82+
vis[i] = true;
83+
else
84+
break;
85+
for (int i = p + 1, v = h[0][p]; i <= n && !vis[i] && h[1][i]; i++)
86+
if ((v = min(v, h[0][i])) == h[1][i])
87+
vis[i] = true;
88+
else
89+
break;
90+
}
91+
92+
for (int i = 1; i <= n; i++)
93+
if (h[1][i] && !vis[i]) return cout << -1 << endl, void();
94+
95+
cout << ans.size() << endl;
96+
for (auto x : ans) cout << id[x] << ' ';
97+
cout << endl;
98+
99+
return;
100+
}
101+
102+
int main() {
103+
ios::sync_with_stdio(false), cin.tie(nullptr);
104+
105+
int _ = 1;
106+
while (_--) solve();
107+
108+
return 0;
109+
}

0 commit comments

Comments
 (0)