diff --git a/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 1/A.cpp b/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 1/A.cpp new file mode 100644 index 0000000..de65f9a --- /dev/null +++ b/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 1/A.cpp @@ -0,0 +1,97 @@ +/** + * @file A.cpp + * @author Macesuted (i@macesuted.moe) + * @date 2024-08-20 + * + * @copyright Copyright (c) 2024 + * + */ + +#include +using namespace std; + +#ifndef LOCAL +#define endl '\n' +#endif + +bool mem1; + +#define maxn 1000005 + +int64_t a[maxn], cnt[2][10]; + +bool chk(int m1, int m2, int64_t cnt[]) { + if (m1 < cnt[1]) return false; + m1 -= cnt[1]; + if (m2 <= cnt[2]) return 2 * (cnt[2] - m2) + cnt[4] <= m1; + m2 -= cnt[2]; + if (m2 <= 2 * cnt[4]) return cnt[4] - m2 / 2 + (m2 % 2) <= m1; + m2 -= cnt[4] * 2; + if (m2 <= 3 * cnt[6]) return m2 % 3 <= m1; + m2 -= cnt[6] * 3; + if (m2 <= cnt[3]) return m2 <= m1; + return false; +} + +void solve(void) { + int m, k; + cin >> m >> k; + for (int i = 1; i <= m; i++) cin >> a[i]; + int n = m >> 1; + for (int i = 1; i <= n; i++) a[i] -= a[m - i + 1]; + a[n + 1] = a[0] = 0; + for (int i = n + 1; i; i--) a[i] -= a[i - 1]; + n++; + if (k == 1) { + int64_t ans = 0; + for (int i = 1; i <= n; i++) + if (a[i] > 0) ans += a[i]; + cout << ans << endl; + return; + } else if (k == 2) { + int64_t sum = 0, cnt[2] = {0, 0}; + for (int i = 1; i <= n; i++) + if (a[i] > 0) + sum += a[i], cnt[0] += a[i] / 2; + else + cnt[1] += -a[i] / 2; + cout << sum - min(cnt[0], cnt[1]) << endl; + return; + } + for (int i = 1; i <= n; i++) { + if (!a[i]) continue; + int t = a[i] > 0; + a[i] = abs(a[i]); + cnt[t][6] += (a[i] - 2) / 6, a[i] = (a[i] - 2) % 6 + 2; + if (a[i] == 5 || a[i] == 7) cnt[t][3]++, a[i] -= 3; + cnt[t][a[i]]++; + } + int64_t tot = 0, ans = INT64_MAX; + for (int i = 1; i <= 6; i++) tot += i * cnt[0][i]; + for (int m1 = cnt[0][1] + 2 * cnt[0][2] + 3 * cnt[0][3] + 4 * cnt[0][4] + 6; ~m1; m1--) + for (int m2 = cnt[0][2] + cnt[0][3] + 2 * cnt[0][4] + 3; ~m2; m2--) { + if (m1 + m2 * 2 > tot || (tot - m1 - m2 * 2) % 3) continue; + int64_t m3 = (tot - m1 - m2 * 2) / 3; + if (m1 + m2 + m3 >= ans) continue; + if (chk(m1, m2, cnt[0]) && chk(m1, m2, cnt[1])) ans = m1 + m2 + m3; + } + cout << ans << endl; + return; +} + +bool mem2; + +int main() { + ios::sync_with_stdio(false), cin.tie(nullptr); +#ifdef LOCAL + cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl; +#endif + + int _ = 1; + while (_--) solve(); + +#ifdef LOCAL + cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl; +#endif + return 0; +} \ No newline at end of file diff --git a/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 2/J.cpp b/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 2/J.cpp new file mode 100644 index 0000000..be5f4ca --- /dev/null +++ b/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 2/J.cpp @@ -0,0 +1,144 @@ +/** + * @file J.cpp + * @author Macesuted (i@macesuted.moe) + * @date 2024-08-21 + * + * @copyright Copyright (c) 2024 + * + */ + +#include +using namespace std; + +#define endl '\n' +#define maxn 100005 + +class SegmentTree { + private: + int64_t minv[maxn << 2], maxv[maxn << 2], sum[maxn << 2], laz[maxn << 2]; + int n; + + void pushDown(int p, int l, int r) { + if (!laz[p]) return; + int mid = (l + r) >> 1; + sum[p << 1] += (mid - l + 1) * laz[p], minv[p << 1] += laz[p], maxv[p << 1] += laz[p], laz[p << 1] += laz[p]; + sum[p << 1 | 1] += (r - mid) * laz[p], minv[p << 1 | 1] += laz[p], maxv[p << 1 | 1] += laz[p], + laz[p << 1 | 1] += laz[p]; + laz[p] = 0; + return; + } + void pushUp(int p) { + minv[p] = min(minv[p << 1], minv[p << 1 | 1]), maxv[p] = max(maxv[p << 1], maxv[p << 1 | 1]); + sum[p] = sum[p << 1] + sum[p << 1 | 1]; + return; + } + void build(int p, int l, int r, int a[]) { + if (l == r) return minv[p] = maxv[p] = sum[p] = a[l], void(); + int mid = (l + r) >> 1; + build(p << 1, l, mid, a), build(p << 1 | 1, mid + 1, r, a); + return pushUp(p); + } + void add(int p, int l, int r, int ql, int qr, int64_t v) { + if (ql <= l && r <= qr) return minv[p] += v, maxv[p] += v, laz[p] += v, sum[p] += (r - l + 1) * v, void(); + pushDown(p, l, r); + int mid = (l + r) >> 1; + if (ql <= mid) add(p << 1, l, mid, ql, qr, v); + if (qr > mid) add(p << 1 | 1, mid + 1, r, ql, qr, v); + return pushUp(p); + } + void div(int p, int l, int r, int ql, int qr, int64_t v) { + if (ql <= l && r <= qr && minv[p] == maxv[p]) { + int64_t d = minv[p] / v, val = (minv[p] > 0) ? d : (d - (v * d != minv[p])); + laz[p] += val - minv[p], sum[p] += (r - l + 1) * (val - minv[p]), minv[p] = maxv[p] = val; + return; + } + if (ql <= l && r <= qr && minv[p] + 1 == maxv[p]) { + int64_t d = minv[p] / v, val = (minv[p] > 0) ? d : (d - (v * d != minv[p])); + int64_t _d = maxv[p] / v, _val = (maxv[p] > 0) ? _d : (_d - (v * _d != maxv[p])); + if (minv[p] - val == maxv[p] - _val) { + laz[p] += val - minv[p], sum[p] += (r - l + 1) * (val - minv[p]); + minv[p] = val; + maxv[p] = _val; + return; + } + } + pushDown(p, l, r); + int mid = (l + r) >> 1; + if (ql <= mid) div(p << 1, l, mid, ql, qr, v); + if (qr > mid) div(p << 1 | 1, mid + 1, r, ql, qr, v); + return pushUp(p); + } + int64_t getMin(int p, int l, int r, int ql, int qr) { + if (ql <= l && r <= qr) return minv[p]; + pushDown(p, l, r); + int mid = (l + r) >> 1; + if (qr <= mid) return getMin(p << 1, l, mid, ql, qr); + if (ql > mid) return getMin(p << 1 | 1, mid + 1, r, ql, qr); + return min(getMin(p << 1, l, mid, ql, qr), getMin(p << 1 | 1, mid + 1, r, ql, qr)); + } + int64_t getSum(int p, int l, int r, int ql, int qr) { + if (ql <= l && r <= qr) return sum[p]; + pushDown(p, l, r); + int mid = (l + r) >> 1; + if (qr <= mid) return getSum(p << 1, l, mid, ql, qr); + if (ql > mid) return getSum(p << 1 | 1, mid + 1, r, ql, qr); + return getSum(p << 1, l, mid, ql, qr) + getSum(p << 1 | 1, mid + 1, r, ql, qr); + } + void print(int p, int l, int r) { + if (l == r) { + cerr << l << ' ' << r << ' ' << sum[p] << ' ' << minv[p] << ' ' << maxv[p] << endl; + return; + } + pushDown(p, l, r); + int mid = (l + r) >> 1; + print(p << 1, l, mid), print(p << 1 | 1, mid + 1, r); + return pushUp(p); + } + + public: + void resize(int _n) { return n = _n, void(); } + void build(int a[]) { return build(1, 1, n, a); } + void add(int l, int r, int64_t v) { return add(1, 1, n, l, r, v); } + void div(int l, int r, int64_t v) { return div(1, 1, n, l, r, v); } + int64_t getMin(int l, int r) { return getMin(1, 1, n, l, r); } + int64_t getSum(int l, int r) { return getSum(1, 1, n, l, r); } + void print(void) { return print(1, 1, n); } +} ST; + +int read(void) { + char c = getchar(); + int64_t f = +1, x = 0; + while (c < '0' || c > '9') (c == '-') && (f = -f), c = getchar(); + while ('0' <= c && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar(); + return x * f; +} + +int a[maxn]; + +void solve(void) { + int n = read(), q = read(); + ST.resize(n); + for (int i = 1; i <= n; i++) a[i] = read(); + ST.build(a); + while (q--) { + int op = read(), l = read(), r = read(); + if (op == 1) + ST.add(l, r, read()); + else if (op == 2) + ST.div(l, r, read()); + else if (op == 3) + cout << ST.getMin(l, r) << endl; + else + cout << ST.getSum(l, r) << endl; + } + return; +} + +int main() { + ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); + + int _ = 1; + while (_--) solve(); + + return 0; +} \ No newline at end of file diff --git a/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 3/B.cpp b/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 3/B.cpp new file mode 100644 index 0000000..ca9a07b --- /dev/null +++ b/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 3/B.cpp @@ -0,0 +1,57 @@ +/** + * @file B.cpp + * @author Macesuted (i@macesuted.moe) + * @date 2024-08-22 + * + * @copyright Copyright (c) 2024 + * + */ + +#include +using namespace std; + +#define maxn 5005 +#define mod 1000000007 + +bool mem1; + +int cnt[maxn]; +int f[3][maxn][maxn]; + +int64_t Mod(int64_t x) { return x >= mod ? x - mod : x; } + +bool mem2; + +void solve(void) { + int n, m; + cin >> n >> m; + for (int i = 1, x; i <= n; i++) cin >> x, cnt[x]++; + f[1][0][0] = 1; + for (int i = 1; i <= m; i++) { + int p = i % 3, q = (i + 1) % 3; + for (int j = 0; j <= cnt[i + 1]; j++) + for (int k = 0; k <= cnt[i + 2]; k++) f[q][j][k] = 0; + for (int j = 0; j <= cnt[i]; j++) + for (int k = 0; k <= cnt[i + 1]; k++) + if (f[p][j][k]) { + int vl = (cnt[i] - j) % 3, vr = min({cnt[i] - j, cnt[i + 1] - k, cnt[i + 2]}); + while ((cnt[i] - j - vr) % 3) vr--; + if (vl > vr) continue; + f[q][k + vl][vl] = Mod(f[q][k + vl][vl] + f[p][j][k]); + f[q][k + vr + 3][vr + 3] = Mod(f[q][k + vr + 1][vr + 1] + mod - f[p][j][k]); + } + for (int j = 0; j <= cnt[i + 1]; j++) + for (int k = 0; k <= cnt[i + 2]; k++) f[q][j + 3][k + 3] = Mod(f[q][j + 3][k + 3] + f[q][j][k]); + } + cout << f[(m + 1) % 3][0][0] << endl; + return; +} + +int main() { + ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); + + int _ = 1; + while (_--) solve(); + + return 0; +} \ No newline at end of file diff --git a/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 3/D.cpp b/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 3/D.cpp new file mode 100644 index 0000000..7e9358c --- /dev/null +++ b/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 3/D.cpp @@ -0,0 +1,43 @@ +/** + * @file D.cpp + * @author Macesuted (i@macesuted.moe) + * @date 2024-08-22 + * + * @copyright Copyright (c) 2024 + * + */ + +#include +using namespace std; + +bool mem1; + +#define maxn 100005 + +int64_t l[maxn], r[maxn]; + +bool mem2; + +void solve(void) { + int n; + int64_t sum, suml = 0, sumr = 0; + cin >> n >> sum; + for (int i = 1; i <= n; i++) cin >> l[i] >> r[i], suml += l[i], sumr += r[i]; + for (int i = 1; i <= n; i++) { + suml -= l[i], sumr -= r[i]; + int64_t vl = max(l[i], sum - sumr), vr = min(r[i], sum - suml); + cout << max((int64_t)0, vr - vl + 1) << ' '; + suml += l[i], sumr += r[i]; + } + cout << endl; + return; +} + +int main() { + ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); + + int _ = 1; + while (_--) solve(); + + return 0; +} \ No newline at end of file diff --git a/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 3/M.cpp b/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 3/M.cpp new file mode 100644 index 0000000..1d062d2 --- /dev/null +++ b/Misc/Tsinghua University Bootcamp in Summer 2024/Tsinghua Bootcamp 2024. Day 3/M.cpp @@ -0,0 +1,63 @@ +/** + * @file M.cpp + * @author Macesuted (i@macesuted.moe) + * @date 2024-08-22 + * + * @copyright Copyright (c) 2024 + * + */ + +#include +using namespace std; + +bool mem1; + +#define maxn 100005 + +typedef pair pli; + +string a; +pli f[1 << 19]; +int64_t pow10[20]; + +bool mem2; + +void solve(void) { + int64_t y; + cin >> a; + cin >> y; + int n = max(0, (int)a.size() - 18), cnt = 0; + for (int t = 9; ~t && cnt < n; t--) + for (int i = 0; i < (int)a.size() && cnt < n; i++) + if (a[i] - '0' == t) cout << a[i], a[i] = ' ', cnt++; + n = 0; + for (int i = 0; i < (int)a.size(); i++) + if (a[i] != ' ') a[n++] = a[i]; + for (int S = 0; S < (1 << n); S++) { + int64_t base = pow10[n - 1 - __builtin_popcount(S)]; + for (int i = 0, cnt = 0; i < n; i++) + if (!(S >> i & 1)) { + f[S | (1 << i)] = max(f[S | (1 << i)], pli{f[S].first + base * (a[i] - '0') - cnt * y, f[S].second + cnt}); + cnt++; + } + } + int S = (1 << n) - 1; + f[S].first += f[S].second * y; + char ans[20]; + for (int i = n - 1; ~i; i--) ans[i] = f[S].first % 10 + '0', f[S].first /= 10; + for (int i = 0; i < n; i++) cout << ans[i]; + cout << endl; + return; +} + +int main() { + ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); + + pow10[0] = 1; + for (int i = 1; i < 20; i++) pow10[i] = pow10[i - 1] * 10; + + int _ = 1; + while (_--) solve(); + + return 0; +} \ No newline at end of file