Skip to content

Commit 72e53cd

Browse files
committed
Tsinghua University Bootcamp 2025, Day 5
1 parent 419206c commit 72e53cd

5 files changed

Lines changed: 336 additions & 0 deletions

File tree

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/**
2+
* @file F.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-08-09
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
int cnt = 0;
14+
15+
int64_t query(int l1, int r1, int l2, int r2) {
16+
cout << "? " << l1 << ' ' << l2 << ' ' << r1 << ' ' << r2 << endl;
17+
int64_t ret;
18+
cin >> ret;
19+
return ret;
20+
}
21+
22+
void solve(void) {
23+
int lp1, lp2, rp1, rp2;
24+
25+
int l = 0, r = 1e9;
26+
while (l + 1 < r) {
27+
int mid = (l + r) >> 1;
28+
(query(1, 1e9, 1, mid) >= int64_t(1e9) * mid + 2 ? r : l) = mid;
29+
}
30+
31+
rp2 = r;
32+
33+
l = 0;
34+
while (l + 1 < r) {
35+
int mid = (l + r) >> 1;
36+
(query(1, 1e9, 1, mid) >= int64_t(1e9) * mid + 1 ? r : l) = mid;
37+
}
38+
39+
rp1 = r;
40+
41+
l = 0, r = 1e9;
42+
while (l + 1 < r) {
43+
int mid = (l + r) >> 1;
44+
(query(1, mid, 1, 1e9) >= int64_t(1e9) * mid + 2 ? r : l) = mid;
45+
}
46+
47+
lp2 = r;
48+
49+
l = 0;
50+
while (l + 1 < r) {
51+
int mid = (l + r) >> 1;
52+
(query(1, mid, 1, 1e9) >= int64_t(1e9) * mid + 1 ? r : l) = mid;
53+
}
54+
55+
lp1 = r;
56+
57+
if (query(lp1, lp1, rp1, rp1) == 1)
58+
cout << "! " << lp1 << ' ' << rp2 << ' ' << lp2 << ' ' << rp1 << endl;
59+
else
60+
cout << "! " << lp1 << ' ' << rp1 << ' ' << lp2 << ' ' << rp2 << endl;
61+
62+
return;
63+
}
64+
65+
int main() {
66+
ios::sync_with_stdio(false), cin.tie(nullptr);
67+
68+
int _ = 1;
69+
while (_--) solve();
70+
71+
return 0;
72+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* @file G.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-08-09
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
void solve(void) {
14+
int x, b;
15+
cin >> x >> b;
16+
17+
if (x >= b) return cout << -1 << endl, void();
18+
19+
int r = b % x, t = b / x + (b % x > 0);
20+
if (r == 0) r = x;
21+
22+
vector<int> ans;
23+
ans.push_back(r);
24+
ans.push_back(0);
25+
for (int i = r + 1; i < b && ans.size() < t; i++) ans.push_back(i);
26+
27+
for (auto x : ans) cout << x << ' ';
28+
cout << endl;
29+
30+
return;
31+
}
32+
33+
int main() {
34+
ios::sync_with_stdio(false), cin.tie(nullptr);
35+
36+
int _ = 1;
37+
while (_--) solve();
38+
39+
return 0;
40+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
/**
2+
* @file H.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-08-09
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+
using int128_t = __int128_t;
16+
17+
bool mem1;
18+
19+
class SegmentTree {
20+
private:
21+
struct Node {
22+
int128_t sum;
23+
int64_t deltSum, cnt;
24+
int l, r, deltCnt, laz;
25+
bool cls;
26+
Node(void) { l = r = 0, sum = cnt = deltSum = deltCnt = laz = 0, cls = false; }
27+
};
28+
29+
Node a[15000000];
30+
int pos;
31+
32+
int root;
33+
const int64_t n = 1e12;
34+
35+
int newNode(void) { return a[++pos] = Node(), pos; }
36+
37+
void pushDown(int p) {
38+
if (!a[p].l) a[p].l = newNode();
39+
if (!a[p].r) a[p].r = newNode();
40+
int l = a[p].l, r = a[p].r;
41+
if (a[p].cls) {
42+
a[l].sum = a[l].cnt = a[l].laz = 0, a[l].cls = true;
43+
a[r].sum = a[r].cnt = a[r].laz = 0, a[r].cls = true;
44+
a[p].cls = false;
45+
}
46+
if (a[p].laz) {
47+
a[l].sum += a[p].laz * (int128_t)a[l].deltSum, a[l].cnt += a[p].laz * (int64_t)a[l].deltCnt, a[l].laz += a[p].laz;
48+
a[r].sum += a[p].laz * (int128_t)a[r].deltSum, a[r].cnt += a[p].laz * (int64_t)a[r].deltCnt, a[r].laz += a[p].laz;
49+
a[p].laz = 0;
50+
}
51+
return;
52+
}
53+
void pushUp(int p) {
54+
a[p].sum = a[p].cnt = 0;
55+
if (a[p].l) a[p].sum += a[a[p].l].sum, a[p].cnt += a[a[p].l].cnt;
56+
if (a[p].r) a[p].sum += a[a[p].r].sum, a[p].cnt += a[a[p].r].cnt;
57+
return;
58+
}
59+
60+
void addLaz(int& p, int64_t l, int64_t r, int64_t qp) {
61+
if (!p) p = newNode();
62+
a[p].deltSum += qp, a[p].deltCnt++;
63+
if (l == r) return;
64+
int64_t mid = (l + r) >> 1;
65+
qp <= mid ? addLaz(a[p].l, l, mid, qp) : addLaz(a[p].r, mid + 1, r, qp);
66+
return;
67+
}
68+
void insert(int& p, int64_t l, int64_t r, int64_t qp) {
69+
if (!p) p = newNode();
70+
if (l == r) return a[p].sum += l, a[p].cnt++, void();
71+
pushDown(p);
72+
int64_t mid = (l + r) >> 1;
73+
qp <= mid ? insert(a[p].l, l, mid, qp) : insert(a[p].r, mid + 1, r, qp);
74+
return pushUp(p);
75+
}
76+
int64_t query(int& p, int64_t l, int64_t r, int64_t& v) {
77+
if (!p) return 0;
78+
if (a[p].sum <= v) {
79+
int64_t ret = a[p].cnt;
80+
v -= a[p].sum, a[p].sum = a[p].cnt = a[p].laz = 0, a[p].cls = true;
81+
return ret;
82+
}
83+
if (l == r) {
84+
int64_t ret = v / l;
85+
a[p].sum -= l * ret, a[p].cnt -= ret, v -= ret * l;
86+
if (v) a[p].sum -= l, a[p].cnt--, insert(root, 1, n, l - v), v = 0;
87+
return ret;
88+
}
89+
pushDown(p);
90+
int64_t mid = (l + r) >> 1, ans = 0;
91+
ans += query(a[p].l, l, mid, v);
92+
if (v) ans += query(a[p].r, mid + 1, r, v);
93+
return pushUp(p), ans;
94+
}
95+
96+
public:
97+
SegmentTree(void) { pos = 0, root = newNode(); }
98+
void addLaz(int64_t p) { return addLaz(root, 1, n, p); }
99+
void genLaz(void) { return a[root].sum += a[root].deltSum, a[root].cnt += a[root].deltCnt, a[root].laz++, void(); }
100+
int64_t query(int64_t v) { return query(root, 1, n, v); }
101+
} SGT;
102+
103+
#define maxn 300005
104+
105+
int64_t a[maxn], c[maxn], ans[maxn];
106+
107+
bool mem2;
108+
109+
void solve(void) {
110+
int n, m;
111+
cin >> n >> m;
112+
for (int i = 1; i <= n; i++) cin >> a[i];
113+
for (int i = 1; i <= m; i++) cin >> c[i], SGT.addLaz(c[i]);
114+
115+
ans[n + 1] = 0;
116+
for (int i = n; i; i--) {
117+
SGT.genLaz();
118+
ans[i] = ans[i + 1] + SGT.query(a[i]);
119+
}
120+
121+
for (int i = 1; i <= n; i++) cout << ans[i] << ' ';
122+
cout << endl;
123+
124+
return;
125+
}
126+
127+
int main() {
128+
ios::sync_with_stdio(false), cin.tie(nullptr);
129+
130+
int _ = 1;
131+
while (_--) solve();
132+
133+
return 0;
134+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* @file K.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-08-09
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+
string trans(string s) {
16+
if ('1' <= s[0] && s[0] <= '9') {
17+
reverse(s.begin(), s.end());
18+
string t;
19+
for (int i = 0; i < (int)s.size(); i++) {
20+
if (i > 0 && i % 3 == 0) t.push_back('\'');
21+
t.push_back(s[i]);
22+
}
23+
reverse(t.begin(), t.end());
24+
return t;
25+
}
26+
return s;
27+
}
28+
29+
void solve(void) {
30+
string s;
31+
cin >> s;
32+
int p1 = 0;
33+
while (s[p1] != '=') p1++;
34+
int p2 = p1;
35+
while (s[p2] != '+') p2++;
36+
cout << s.substr(0, p1) << '=' << trans(s.substr(p1 + 1, p2 - p1 - 1)) << '+' << trans(s.substr(p2 + 1)) << endl;
37+
return;
38+
}
39+
40+
int main() {
41+
ios::sync_with_stdio(false), cin.tie(nullptr);
42+
43+
int _ = 1;
44+
while (_--) solve();
45+
46+
return 0;
47+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* @file L.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-08-09
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
#define maxn 400005
15+
16+
int a[maxn], b[maxn];
17+
int64_t f[maxn];
18+
19+
int main() {
20+
ios::sync_with_stdio(0), cin.tie(0);
21+
22+
int n;
23+
cin >> n;
24+
25+
for (int i = 1; i <= n; i++) cin >> a[i];
26+
for (int i = 1; i <= n; i++) cin >> b[i], b[i] = (b[i] ? ~0 : 0);
27+
28+
memset(f, 0xc0, sizeof f);
29+
30+
f[0] = 0;
31+
for (int i = 1; i <= n; i++)
32+
for (int v = a[i], j = min(i - 1., max(10000., 0.135 * (i - 1))), ed = max(0., min(i - 10000., 0.09 * (i - 1)));
33+
j >= ed; j--)
34+
f[j + 1] = max(f[j + 1], f[j]), f[j] += b[i - j] & v;
35+
36+
int pos = 0;
37+
for (int i = 0; i <= n; i++)
38+
if (f[i] > f[pos]) pos = i;
39+
40+
cout << f[pos] << endl;
41+
42+
return 0;
43+
}

0 commit comments

Comments
 (0)