Skip to content

Commit fa2009c

Browse files
committed
Petrozavodsk Summer 2023. Day 3. ABalobanov Contest 1
1 parent c6c292f commit fa2009c

4 files changed

Lines changed: 286 additions & 0 deletions

File tree

QOJ/9325.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/**
2+
* @file 9325.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-10-31
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 200005
16+
#define maxlgn 20
17+
#define mod 998244353
18+
19+
class STList {
20+
private:
21+
int a[maxlgn][maxn], lg[maxn];
22+
23+
public:
24+
void build(int n, int v[]) {
25+
for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
26+
for (int i = 1; i <= n; i++) a[0][i] = v[i];
27+
for (int t = 1; t <= lg[n]; t++)
28+
for (int l = 1; l + (1 << t) - 1 <= n; l++) a[t][l] = min(a[t - 1][l], a[t - 1][l + (1 << (t - 1))]);
29+
return;
30+
}
31+
int query(int l, int r) {
32+
int t = lg[r - l + 1];
33+
return min(a[t][l], a[t][r - (1 << t) + 1]);
34+
}
35+
} STL;
36+
37+
int a[maxn], p[maxn];
38+
vector<int> fl[maxn], gl[maxn], fr[maxn], gr[maxn];
39+
40+
int Mod(int x) { return x >= mod ? x - mod : x; }
41+
42+
void solve(int l, int r) {
43+
if (l > r) return;
44+
45+
int x = p[STL.query(l, r)];
46+
solve(l, x - 1), solve(x + 1, r);
47+
48+
fl[x].resize(x - l + 1), fr[x].resize(r - x + 1);
49+
for (int i = l; i < x; i++) {
50+
int y = p[STL.query(i, x - 1)];
51+
fl[x][x - i] = Mod(gl[y][y - i] + gr[y][x - 1 - y] + 1);
52+
}
53+
for (int i = x + 1; i <= r; i++) {
54+
int y = p[STL.query(x + 1, i)];
55+
fr[x][i - x] = Mod(gl[y][y - x - 1] + gr[y][i - y] + 1);
56+
}
57+
58+
gl[x] = fl[x];
59+
for (size_t i = 1; i < gl[x].size(); i++) gl[x][i] = Mod(gl[x][i] + gl[x][i - 1]);
60+
gr[x] = fr[x];
61+
for (size_t i = 1; i < gr[x].size(); i++) gr[x][i] = Mod(gr[x][i] + gr[x][i - 1]);
62+
63+
return;
64+
}
65+
66+
void solve(void) {
67+
int n;
68+
cin >> n;
69+
for (int i = 1; i <= n; i++) cin >> a[i], p[a[i]] = i;
70+
71+
STL.build(n, a);
72+
for (int i = 1; i <= n; i++) fl[i] = gl[i] = fr[i] = gr[i] = vector<int>();
73+
solve(1, n);
74+
75+
int x = p[STL.query(1, n)];
76+
cout << Mod(gl[x][x - 1] + gr[x][n - x] + 1) << endl;
77+
78+
return;
79+
}
80+
81+
int main() {
82+
ios::sync_with_stdio(false), cin.tie(nullptr);
83+
84+
int _ = 1;
85+
cin >> _;
86+
while (_--) solve();
87+
88+
return 0;
89+
}

QOJ/9326.cpp

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/**
2+
* @file 9326.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-10-31
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+
#define maxlgn 20
17+
18+
class STList {
19+
private:
20+
int64_t a[maxlgn][maxn];
21+
int lg[maxn], n;
22+
23+
public:
24+
void build(int _n) {
25+
n = _n;
26+
for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
27+
return;
28+
}
29+
void modi(int p, int64_t v) {
30+
a[0][p] = v;
31+
for (int t = 1; p + (1 << t) - 1 <= n; t++) a[t][p] = min(a[t - 1][p], a[t - 1][p + (1 << (t - 1))]);
32+
return;
33+
}
34+
int64_t query(int l, int r) {
35+
int t = lg[r - l + 1];
36+
return min(a[t][l], a[t][r - (1 << t) + 1]);
37+
}
38+
} STLg, STLf;
39+
40+
int64_t f[maxn], a[maxn];
41+
int ql[maxn], qr[maxn];
42+
43+
void solve(void) {
44+
int n, c;
45+
cin >> n >> c;
46+
for (int i = 1; i <= n; i++) cin >> ql[i];
47+
for (int i = 1; i <= n; i++) cin >> qr[i];
48+
for (int i = 1; i <= n; i++) cin >> a[i];
49+
50+
STLf.build(n), STLg.build(n);
51+
52+
for (int i = n; i; i--) {
53+
if (i + ql[i] <= n) {
54+
f[i] = STLf.query(max(i + 1, i + ql[i] - c), i + ql[i]);
55+
if (i + qr[i] > n) qr[i] = n - i, f[i] = max(f[i], (int64_t)0);
56+
if (qr[i] > c) f[i] = max(f[i], -STLg.query(i + max(ql[i], c + 1), i + qr[i]));
57+
} else
58+
f[i] = 0;
59+
STLf.modi(i, f[i] += a[i]);
60+
if (i + c <= n) STLg.modi(i + c, -STLf.query(i, i + c));
61+
}
62+
63+
cout << f[1] - a[1] << endl;
64+
65+
return;
66+
}
67+
68+
int main() {
69+
ios::sync_with_stdio(false), cin.tie(nullptr);
70+
71+
int _ = 1;
72+
cin >> _;
73+
while (_--) solve();
74+
75+
return 0;
76+
}

QOJ/9327.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/**
2+
* @file 9327.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-10-31
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 100005
16+
17+
int a[maxn], p[maxn], sum[maxn], cnt[maxn];
18+
map<int, int> S;
19+
20+
void solve(void) {
21+
int n, q;
22+
cin >> n >> q;
23+
int B = sqrt(n);
24+
25+
for (int i = 1; i <= n; i++) cin >> a[i], p[a[i]] = i;
26+
27+
auto add = [&](int x, int y, int delt) -> void {
28+
int64_t v = abs(x - y) * abs(a[x] - a[y]);
29+
if (v > maxn) return;
30+
sum[v / B] += delt, cnt[v] += delt;
31+
return;
32+
};
33+
auto getAns = [&](void) -> int {
34+
int ans = 0;
35+
while (!sum[ans / B]) ans += B;
36+
while (!cnt[ans]) ans++;
37+
return ans;
38+
};
39+
40+
for (int i = 1; i <= n; i++)
41+
for (int j = i + 1; j <= min(n, i + B); j++) add(i, j, +1), add(p[i], p[j], +1);
42+
43+
cout << getAns() << endl;
44+
while (q--) {
45+
int x, y;
46+
cin >> x >> y;
47+
48+
auto calc = [&](int delt) -> void {
49+
for (int i = max(1, x - B); i <= min(n, x + B); i++)
50+
if (i != x) add(x, i, delt);
51+
for (int i = max(1, y - B); i <= min(n, y + B); i++)
52+
if (i != x && i != y) add(y, i, delt);
53+
for (int i = max(1, a[x] - B); i <= min(n, a[x] + B); i++)
54+
if (i != a[x]) add(x, p[i], delt);
55+
for (int i = max(1, a[y] - B); i <= min(n, a[y] + B); i++)
56+
if (i != a[x] && i != a[y]) add(y, p[i], delt);
57+
return;
58+
};
59+
60+
calc(-1);
61+
swap(a[x], a[y]);
62+
swap(p[a[x]], p[a[y]]);
63+
calc(+1);
64+
65+
cout << getAns() << endl;
66+
}
67+
return;
68+
}
69+
70+
int main() {
71+
ios::sync_with_stdio(false), cin.tie(nullptr);
72+
73+
int _ = 1;
74+
while (_--) solve();
75+
76+
return 0;
77+
}

QOJ/9328.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* @file 9328.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-10-31
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+
bool solve(void) {
16+
int n;
17+
string s;
18+
cin >> n >> s;
19+
20+
vector<vector<int>> cnt(2, vector<int>(26, 0));
21+
for (int i = 0; i < n; i++) cnt[i & 1][s[i] - 'a']++;
22+
23+
if (n & 1) {
24+
int cc[2] = {0, 0};
25+
for (int t = 0; t < 2; t++)
26+
for (int i = 0; i < 26; i++) cc[t] += cnt[t][i] & 1;
27+
int x = n >> 1 & 1;
28+
return cc[!x] == 0 && cc[x] == 1;
29+
}
30+
31+
for (int i = 0; i < 26; i++)
32+
if (cnt[0][i] != cnt[1][i]) return false;
33+
return true;
34+
}
35+
36+
int main() {
37+
ios::sync_with_stdio(false), cin.tie(nullptr);
38+
39+
int _ = 1;
40+
cin >> _;
41+
while (_--) cout << (solve() ? "YES" : "NO") << endl;
42+
43+
return 0;
44+
}

0 commit comments

Comments
 (0)