Skip to content

Commit a705af8

Browse files
committed
The 4th Universal Cup. Stage 2: Grand Prix of Paris
1 parent b54e4fb commit a705af8

File tree

4 files changed

+277
-2
lines changed

4 files changed

+277
-2
lines changed

QOJ/14131.cpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/**
2+
* @file 14131.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2025-10-11
5+
*
6+
* @copyright Copyright (c) 2025
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+
using pii = pair<int, int>;
20+
21+
int64_t f[2][6][505];
22+
23+
void solve(void) {
24+
int n, K;
25+
cin >> n >> K;
26+
27+
vector<pii> A[2];
28+
for (int i = 1, x, y; i <= n; i++) {
29+
cin >> x >> y;
30+
if (x <= 100)
31+
A[0].emplace_back(x, y);
32+
else
33+
A[1].emplace_back(y, x);
34+
}
35+
36+
for (int t = 0; t < 2; t++) {
37+
for (int j = 0; j <= K; j++)
38+
for (int k = 0; k <= 100 * j; k++) f[t][j][k] = -1;
39+
f[t][0][0] = 0;
40+
for (auto [x, y] : A[t])
41+
for (int j = K - 1; ~j; j--)
42+
for (int k = 0; k <= 100 * j; k++)
43+
if (f[t][j][k] != -1) f[t][j + 1][k + x] = max(f[t][j + 1][k + x], f[t][j][k] + y);
44+
}
45+
46+
int64_t ans = 0;
47+
48+
for (int l = 0, r = K; l <= K; l++, r--)
49+
for (int vl = 0; vl <= 100 * l; vl++)
50+
for (int vr = 0; vr <= 100 * r; vr++)
51+
if (f[0][l][vl] != -1 && f[1][r][vr] != -1) ans = max(ans, (vl + f[1][r][vr]) * (f[0][l][vl] + vr));
52+
53+
cout << ans << endl;
54+
55+
return;
56+
}
57+
58+
bool mem2;
59+
60+
int main() {
61+
ios::sync_with_stdio(false), cin.tie(nullptr);
62+
#ifdef LOCAL
63+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
64+
#endif
65+
66+
int _ = 1;
67+
cin >> _;
68+
while (_--) solve();
69+
70+
#ifdef LOCAL
71+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
72+
#endif
73+
return 0;
74+
}

QOJ/14136.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/**
2+
* @file 14136.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2025-10-11
5+
*
6+
* @copyright Copyright (c) 2025
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+
void solve(void) {
20+
vector<string> rec;
21+
string line;
22+
while (getline(cin, line)) {
23+
size_t p = line.size();
24+
for (size_t i = 0; i < line.size(); i++)
25+
if (line[i] == ' ') p = i;
26+
27+
if (p == line.size()) {
28+
rec.push_back("#");
29+
continue;
30+
}
31+
32+
string s = line.substr(p + 1);
33+
34+
if (line == s + ", " + s + " " + s + "ity " + s)
35+
rec.push_back(s + "!");
36+
else if (line == "i said " + s + ", " + s + " " + s + "ity " + s)
37+
rec.push_back(s + "@");
38+
else
39+
rec.push_back("#");
40+
}
41+
42+
int ans = -1;
43+
44+
for (size_t l = 0, r; l < rec.size(); l = r + 1) {
45+
r = l;
46+
if (rec[l].back() != '!') continue;
47+
48+
size_t len = rec[l].size() - 1;
49+
string s = rec[l].substr(0, len);
50+
while (r + 1 < rec.size() && rec[r + 1].size() == len + 1 && rec[r + 1].substr(0, len) == s &&
51+
rec[r + 1].back() != rec[r].back())
52+
r++;
53+
54+
ans = max(ans, int((r - l + 1) / 2 * (23 + 8 * len)));
55+
}
56+
57+
cout << ans << endl;
58+
59+
return;
60+
}
61+
62+
bool mem2;
63+
64+
int main() {
65+
ios::sync_with_stdio(false), cin.tie(nullptr);
66+
#ifdef LOCAL
67+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
68+
#endif
69+
70+
int _ = 1;
71+
while (_--) solve();
72+
73+
#ifdef LOCAL
74+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
75+
#endif
76+
return 0;
77+
}

QOJ/14140.cpp

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/**
2+
* @file 14140.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2025-10-11
5+
*
6+
* @copyright Copyright (c) 2025
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 mod 998244353
20+
#define maxn 200005
21+
22+
using pll = pair<int64_t, int64_t>;
23+
24+
int64_t qpow(int64_t a, int64_t x) {
25+
int64_t ans = 1;
26+
while (x) {
27+
if (x & 1) ans = ans * a % mod;
28+
a = a * a % mod, x >>= 1;
29+
}
30+
return ans;
31+
}
32+
int64_t inv(int64_t a) { return qpow(a, mod - 2); }
33+
34+
class SegmentTree {
35+
private:
36+
struct Node {
37+
Node *l, *r;
38+
pll val;
39+
Node(void) { l = r = nullptr, val = {1, 0}; }
40+
};
41+
42+
vector<Node *> roots;
43+
44+
pll merge(const pll &a, const pll &b) { return {a.first * b.first % mod, a.second + b.second}; }
45+
void pushUp(Node *p) {
46+
return p->val = (p->l && p->r) ? merge(p->l->val, p->r->val) : p->l ? p->l->val : p->r->val, void();
47+
}
48+
void insert(Node *&p, int l, int r, int qp) {
49+
p = new Node(p ? *p : Node());
50+
if (l == r) return p->val = merge(p->val, {qp, qp - 1}), void();
51+
int mid = (l + r) >> 1;
52+
qp <= mid ? insert(p->l, l, mid, qp) : insert(p->r, mid + 1, r, qp);
53+
return pushUp(p);
54+
}
55+
pll query(Node *p, int l, int r, int ql, int qr) {
56+
if (!p) return {1, 0};
57+
if (ql <= l && r <= qr) return p->val;
58+
int mid = (l + r) >> 1;
59+
if (qr <= mid) return query(p->l, l, mid, ql, qr);
60+
if (ql > mid) return query(p->r, mid + 1, r, ql, qr);
61+
return merge(query(p->l, l, mid, ql, qr), query(p->r, mid + 1, r, ql, qr));
62+
}
63+
64+
public:
65+
void build(int n, int a[]) {
66+
roots.resize(n + 1);
67+
for (int i = 1; i <= n; i++) insert(roots[i] = roots[i - 1], 1, mod - 1, a[i]);
68+
return;
69+
}
70+
pll query(int l, int r, int vl, int vr) {
71+
pll retl = query(roots[l - 1], 1, mod - 1, vl, vr), retr = query(roots[r], 1, mod - 1, vl, vr);
72+
return {retr.first * inv(retl.first) % mod, retr.second - retl.second};
73+
}
74+
} SGT;
75+
76+
int a[maxn];
77+
78+
void solve(void) {
79+
int n, q;
80+
cin >> n >> q;
81+
82+
for (int i = 1; i <= n; i++) cin >> a[i];
83+
SGT.build(n, a);
84+
85+
while (q--) {
86+
int l, r;
87+
int64_t k;
88+
cin >> l >> r >> k;
89+
90+
int vl = 0, vr = mod;
91+
while (vl + 1 < vr) {
92+
int mid = (vl + vr) >> 1;
93+
(SGT.query(l, r, 1, mid).second <= k ? vl : vr) = mid;
94+
}
95+
96+
if (vl == mod - 1) {
97+
cout << 1 << endl;
98+
continue;
99+
}
100+
101+
k -= SGT.query(l, r, 1, vl).second;
102+
int64_t cnt = SGT.query(l, r, vr, vr).second / (vr - 1) - (k / (vr - 1) + 1), rest = vr - k % (vr - 1);
103+
assert(cnt >= 0);
104+
cout << SGT.query(l, r, vr + 1, mod - 1).first * qpow(vr, cnt) % mod * rest % mod << endl;
105+
}
106+
return;
107+
}
108+
109+
bool mem2;
110+
111+
int main() {
112+
ios::sync_with_stdio(false), cin.tie(nullptr);
113+
#ifdef LOCAL
114+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
115+
#endif
116+
117+
int _ = 1;
118+
while (_--) solve();
119+
120+
#ifdef LOCAL
121+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
122+
#endif
123+
return 0;
124+
}

templates/Data Structure.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,14 +422,14 @@ class LeftistHeap {
422422
}
423423

424424
public:
425-
LeftistTree(void) { root = nullptr; }
425+
LeftistHeap(void) { root = nullptr; }
426426

427427
void push(int v) { return merge(root, root, new Node(v)); }
428428
void pop(void) {
429429
Node *p = root->l, *q = root->r;
430430
return merge(root, p, q);
431431
}
432-
void merge(LeftistTree *t) { return merge(root, root, t->root); }
432+
void merge(LeftistHeap *t) { return merge(root, root, t->root); }
433433
int top(void) { return root ? root->val : -1; }
434434
};
435435
```

0 commit comments

Comments
 (0)