Skip to content

Commit ad5c68d

Browse files
committed
THUPC 2025 sync to LibreOJ and QOJ
1 parent b9ffe27 commit ad5c68d

File tree

8 files changed

+846
-0
lines changed

8 files changed

+846
-0
lines changed

LibreOJ/6945.cpp

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/**
2+
* @file 6945.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2024-12-15
5+
*
6+
* @copyright Copyright (c) 2024
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 maxn 155
20+
#define maxm 10005
21+
22+
typedef pair<int, int> pii;
23+
24+
int a[maxn];
25+
int64_t f[maxn][maxn], g[maxn][maxn], h[maxn][maxn << 1], sum[maxn][maxn];
26+
vector<pii> rec[maxn];
27+
28+
void solve(void) {
29+
int n, m, c;
30+
cin >> n >> m >> c;
31+
for (int i = 1; i <= n; i++) cin >> a[i];
32+
for (int i = 1, w, d, t; i <= m; i++) cin >> w >> d >> t, rec[t].emplace_back(w, d);
33+
34+
for (int t = 1; t <= 150; t++) {
35+
for (int i = 1; i <= 2 * n; i++) h[t][i] = 1e18;
36+
for (auto x : rec[t]) {
37+
int w = x.first, d = x.second;
38+
for (int i = d; i <= 2 * n; i++) h[t][i] = min(h[t][i], h[t][i - d] + w);
39+
for (int i = 2 * n - 1; ~i; i--) h[t][i] = min(h[t][i], h[t][i + 1]);
40+
}
41+
}
42+
43+
for (int l = 1; l <= n; l++)
44+
for (int r = l; r <= n; r++) f[l][r] = 1e18;
45+
46+
for (int t = 150; t >= 0; t--) {
47+
for (int l = 1; l <= n; l++)
48+
for (int r = l; r <= n; r++) sum[l][r] = sum[l][r - 1] + max(0, (a[r] - t) * c);
49+
50+
for (int l = 1; l <= n; l++)
51+
for (int r = l; r <= n; r++) g[l][r] = 1e18;
52+
53+
for (int len = 1; len <= n; len++)
54+
for (int l = 1, r = len; r <= n; l++, r++) {
55+
for (int x = l; x <= r; x++)
56+
f[l][r] = min(f[l][r], f[l][x - 1] + f[x][r]),
57+
g[l][r] = min({g[l][r], g[l][x - 1] + sum[x][r], g[l][x - 1] + f[x][r]});
58+
f[l][r] = min(f[l][r], g[l][r] + h[t][len]);
59+
}
60+
}
61+
62+
cout << f[1][n] << endl;
63+
64+
return;
65+
}
66+
67+
bool mem2;
68+
69+
int main() {
70+
ios::sync_with_stdio(false), cin.tie(nullptr);
71+
#ifdef LOCAL
72+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
73+
#endif
74+
75+
int _ = 1;
76+
while (_--) solve();
77+
78+
#ifdef LOCAL
79+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
80+
#endif
81+
return 0;
82+
}

LibreOJ/6952.cpp

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
/**
2+
* @file 6952.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2024-12-15
5+
*
6+
* @copyright Copyright (c) 2024
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#ifndef LOCAL
14+
#define endl '\n'
15+
#endif
16+
17+
namespace IO {
18+
const int SIZE = 1 << 20;
19+
char Ibuf[SIZE], *Il = Ibuf, *Ir = Ibuf, Obuf[SIZE], *Ol = Obuf, *Or = Ol + SIZE - 1;
20+
int cache[100];
21+
void fill(void) { return Ir = (Il = Ibuf) + fread(Ibuf, 1, SIZE, stdin), void(); }
22+
void flush(void) { return fwrite(Obuf, 1, Ol - Obuf, stdout), Ol = Obuf, void(); }
23+
char getch(void) { return Il == Ir ? fill(), Il == Ir ? EOF : *Il++ : *Il++; }
24+
void putch(char x) { return *Ol++ = x, Ol == Or && (flush(), 0), void(); }
25+
template <typename T = int>
26+
T read(void) {
27+
T x = 0, f = +1;
28+
char c = getch();
29+
while (c < '0' || c > '9') (c == '-') && (f = -f), c = getch();
30+
while ('0' <= c && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getch();
31+
return x * f;
32+
}
33+
template <typename T>
34+
void write(T x) {
35+
if (!x) return putch('0');
36+
if (x < 0) putch('-'), x = -x;
37+
int top = 0;
38+
while (x) cache[top++] = x % 10, x /= 10;
39+
while (top) putch(cache[--top] ^ 48);
40+
return;
41+
}
42+
struct Flusher_ {
43+
~Flusher_() { flush(); }
44+
} io_flusher_;
45+
} // namespace IO
46+
using IO::putch;
47+
using IO::read;
48+
using IO::write;
49+
50+
bool mem1;
51+
52+
#define maxn 250005
53+
#define maxsqrtn 600
54+
#define mod 998244353
55+
56+
typedef pair<int, int> pii;
57+
58+
bool notp[maxn];
59+
vector<int> prime;
60+
set<int> S[maxn];
61+
int64_t a[maxn], mul[maxsqrtn], f[maxn], nxt[maxn];
62+
int xv[maxn], bl[maxsqrtn], br[maxsqrtn], bel[maxn], rest[maxn], jmp[maxn];
63+
bool vis[maxsqrtn];
64+
65+
int64_t Mod(int64_t x) { return x >= mod ? x - mod : x; }
66+
67+
vector<int> split(int v) {
68+
vector<int> ans;
69+
while (v != 1) ans.push_back(xv[v]), v /= xv[v];
70+
return ans;
71+
}
72+
73+
void build(int id) {
74+
for (int i = br[id]; i >= bl[id]; i--) {
75+
f[i] = a[i], nxt[i] = i + jmp[i];
76+
if (nxt[i] <= br[id]) f[i] = Mod(f[i] + f[nxt[i]]), nxt[i] = nxt[nxt[i]];
77+
}
78+
return;
79+
}
80+
81+
void solve(void) {
82+
int n = read(), q = read();
83+
for (int i = 1; i <= n; i++) {
84+
a[i] = read(), rest[i] = i / (jmp[i] = __gcd((int64_t)i, a[i]));
85+
auto ret = split(rest[i]);
86+
for (auto v : ret) S[v].insert(i);
87+
}
88+
89+
int Bsiz = sqrt(n), Bcnt = 0;
90+
while (br[Bcnt] < n) Bcnt++, bl[Bcnt] = br[Bcnt - 1] + 1, br[Bcnt] = min(br[Bcnt - 1] + Bsiz, n), mul[Bcnt] = 1;
91+
92+
for (int t = 1; t <= Bcnt; t++)
93+
for (int i = bl[t]; i <= br[t]; i++) bel[i] = t;
94+
95+
for (int t = 1; t <= Bcnt; t++) build(t);
96+
97+
while (q--) {
98+
int op = read();
99+
if (op == 1) {
100+
int l = read(), r = read(), x = read();
101+
vector<int> rec;
102+
103+
rec.push_back(bel[l]), rec.push_back(bel[r]);
104+
105+
if (bel[l] == bel[r])
106+
for (int i = l; i <= r; i++) a[i] = a[i] * x % mod;
107+
else {
108+
for (int i = l; i <= br[bel[l]]; i++) a[i] = a[i] * x % mod;
109+
for (int i = bl[bel[r]]; i <= r; i++) a[i] = a[i] * x % mod;
110+
for (int i = bel[l] + 1; i < bel[r]; i++) mul[i] = mul[i] * x % mod;
111+
}
112+
113+
vector<int> ret = split(x);
114+
for (auto v : ret)
115+
for (auto p = S[v].lower_bound(l); p != S[v].end() && *p <= r;) {
116+
rec.push_back(bel[*p]), rest[*p] /= v, jmp[*p] *= v;
117+
if (rest[*p] % v)
118+
p = S[v].erase(p);
119+
else
120+
p++;
121+
}
122+
123+
for (auto id : rec)
124+
if (!vis[id]) vis[id] = true, build(id);
125+
for (auto id : rec) vis[id] = false;
126+
} else {
127+
int x = read();
128+
int64_t ans = 0;
129+
while (x <= n) ans = (ans + f[x] * mul[bel[x]]) % mod, x = nxt[x];
130+
write(ans), putch('\n');
131+
}
132+
}
133+
134+
return;
135+
}
136+
137+
bool mem2;
138+
139+
int main() {
140+
ios::sync_with_stdio(false), cin.tie(nullptr);
141+
#ifdef LOCAL
142+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
143+
#endif
144+
145+
for (int i = 2; i < maxn; i++) {
146+
if (!notp[i]) prime.push_back(i), xv[i] = i;
147+
for (auto j = prime.begin(); i * *j < maxn; j++) {
148+
notp[i * *j] = true, xv[i * *j] = *j;
149+
if (i % *j == 0) break;
150+
}
151+
}
152+
153+
int _ = 1;
154+
while (_--) solve();
155+
156+
#ifdef LOCAL
157+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
158+
#endif
159+
return 0;
160+
}

LibreOJ/6954.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/**
2+
* @file 6954.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2024-12-15
5+
*
6+
* @copyright Copyright (c) 2024
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 maxn 1000005
20+
21+
int bl[maxn], deg[maxn];
22+
bool ban[maxn], col[maxn], vis[maxn];
23+
vector<int> graph[maxn];
24+
25+
void solve(void) {
26+
int n, k;
27+
cin >> n >> k;
28+
for (int i = 1; i <= k; i++) cin >> bl[i], col[bl[i]] = true;
29+
for (int i = 1, x, y; i < n; i++) cin >> x >> y, graph[x].push_back(y), graph[y].push_back(x);
30+
for (int i = 1; i <= n; i++) deg[i] = graph[i].size();
31+
for (int i = 1; i <= k; i++)
32+
for (auto p : graph[bl[i]])
33+
if (!col[p]) ban[p] = true;
34+
35+
queue<int> que;
36+
for (int i = 1; i <= n; i++)
37+
if (deg[i] == 1) que.push(i);
38+
39+
int ans = 0;
40+
while (!que.empty()) {
41+
int p = que.front();
42+
que.pop();
43+
vis[p] = true;
44+
if (ban[p]) {
45+
int q = -1;
46+
for (auto i : graph[p])
47+
if (!vis[i]) q = i;
48+
ans++;
49+
if (!col[q]) {
50+
ban[q] = false;
51+
for (auto r : graph[q]) ban[r] = false;
52+
}
53+
}
54+
for (auto i : graph[p])
55+
if (!vis[i] && --deg[i] == 1) que.push(i);
56+
}
57+
58+
for (int i = 1; i <= n; i++)
59+
if (!vis[i] && ban[i]) ans++;
60+
61+
cout << ans << endl;
62+
63+
return;
64+
}
65+
66+
bool mem2;
67+
68+
int main() {
69+
ios::sync_with_stdio(false), cin.tie(nullptr);
70+
#ifdef LOCAL
71+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
72+
#endif
73+
74+
int _ = 1;
75+
while (_--) solve();
76+
77+
#ifdef LOCAL
78+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
79+
#endif
80+
return 0;
81+
}

0 commit comments

Comments
 (0)