3418 字
17 分钟
SEU 2025 SUMMER PRETEST STD
The 21st Southeast University Programming Contest (Summer)
下文链接均为验题链接,题目序号并不与正赛题目一一对应,请在上述正赛链接中自行对照。
题目难度:
A < E J M < I < N F < D G B < L H
Created And Written By:
Huan_YP2002, limithym, jackylova_fan_fan_fan
Tester:
Tobo, Anonyme, thisislike_fan, LANSGANBS, sakuya_maid_fans, xukuan, 9756, king_of_gamers
Std:
Anonyme:
Tobo:
thisislike_fan:
LANSGANBS:
一卡通
void solve() { string s; cin >> s; regex ss("^21[34]\\d{2}(?!0000)\\d{4}$"); if (regex_match(s, ss)) { cout << "YES" << endl; } else { cout << "NO" << endl; }}
Royale Bataille
void solve() { int n, m; cin >> n >> m; vector<string> a(n); for (int i = 0; i < n; i++) cin >> a[i];
const int mod = 998244353;
auto process = [&](vector<tuple<int, int, int, int, int, int>> lim, int n, int m) -> int { int ans = 0; auto check = [&](int s, int t, int l, int r) -> int { return l <= s && r <= t && s <= r; }; int flag1 = 1; int flag2 = 1; int last = 0; for (int i = 0; i < lim.size(); i++) { auto [left, right, left_inner, right_inner, all_r, all_g] = lim[i]; if (!all_g) last = i + 1; } vector<vector<int>> f(m, vector<int>(m)); for (int i = 0; i < lim.size(); i++) { auto [left, right, left_inner, right_inner, all_r, all_g] = lim[i];
vector<vector<int>> tf(m, vector<int>(m)); for (int l1 = 0; l1 < m; l1++) { for (int r1 = l1; r1 < m; r1++) { //l1 <= r2 <= r1 //l2 <= l1 (tf[l1][r1] += f[l1][r1]) %= mod; if (l1) (tf[l1][l1 - 1] -= f[l1][r1]) %= mod; } } for (int l = m - 1; l >= 0; l--) { for (int r = m - 1; r >= 0; r--) { if (l + 1 < m) (tf[l][r] += tf[l + 1][r]) %= mod; if (r + 1 < m) (tf[l][r] += tf[l][r + 1]) %= mod; if (max(l, r) + 1 < m) (tf[l][r] -= tf[l + 1][r + 1]) %= mod; } } for (int l = 0; l < m; l++) { for (int r = l; r < m; r++) { if (left <= l && l <= left_inner && right_inner <= r && r <= right) {
} else { tf[l][r] = 0; } } } if (flag1) { for (int l = left; l <= left_inner; l++) { for (int r = max(l, right_inner); r <= right; r++) { if (i && r + 1 < m) continue; tf[l][r]++; tf[l][r] %= mod; } } } if (i + 1 >= last) { for (int l = 0; l < m; l++) { for (int r = l; r < m; r++) { if (i + 1 < n && l) continue; ans += tf[l][r]; ans %= mod; } } } flag1 &= all_r; flag2 &= all_g; f.swap(tf); } //out2(flag1, flag2); ans += flag1 + flag2; ans %= mod; ans += mod; ans %= mod; return ans; }; auto solve_row = [&]() -> void { vector<tuple<int, int, int, int, int, int>> ans; for (int i = 0; i < m; i++) { int left = 0, right = n - 1; int left_inner = n - 1, right_inner = 0; int flag = 0; for (int j = 0; j < n; j++) { if (a[j][i] != '?') { if (a[j][i] == '0') { if (!flag) { left_inner = right_inner = j; } else { right_inner = j; } flag = 1; } else if (a[j][i] == '1') { left = max(left, j + 1); } else if (a[j][i] == '2') { right = min(right, j - 1); } } } ans.emplace_back(left, right, left_inner, right_inner, !flag && right == n - 1, !flag && left == 0); } cout << process(ans, m, n) << '\n'; }; auto solve_col = [&]() -> void { vector<tuple<int, int, int, int, int, int>> ans; for (int i = 0; i < n; i++) { int left = 0, right = m - 1; int left_inner = m - 1, right_inner = 0; int flag = 0; for (int j = 0; j < m; j++) { if (a[i][j] != '?') { if (a[i][j] == '0') { if (!flag) { left_inner = right_inner = j; } else { right_inner = j; } flag = 1; } else if (a[i][j] == '1') { left = max(left, j + 1); } else if (a[i][j] == '2') { right = min(right, j - 1); } } } ans.emplace_back(left, right, left_inner, right_inner, !flag && right == m - 1, !flag && left == 0); } cout << process(ans, n, m) << '\n'; }; if (m <= n) solve_col(); else solve_row();}
Kings Game (Hard Version)
vc<int> pr, vis, mn;void init(int n) { vis.assign(n + 1, 0); mn.assign(n + 1, 0); for (int i = 2; i <= n; i++) { if (!vis[i]) pr += i, mn[i] = i; for (auto j : pr) { if (i * j > n) break; vis[i * j] = 1; mn[i * j] = j; if (i % j == 0) break; } }}const int mod = 998244353;namespace MTool { inline int Cadd(int a, int b) {return (i64)a + b >= mod ? (i64)a + b - mod : a + b;} inline int Cdel(int a, int b) {return a - b < 0 ? a - b + mod : a - b;} inline int Cmul(int a, int b) {return 1ll * a * b % mod;} inline int sqr(int a) {return 1ll * a * a % mod;} inline void Madd(int &a, int b) {a = (i64)a + b >= mod ? (i64)a + b - mod : a + b;} inline void Mdel(int &a, int b) {a = a - b < 0 ? a - b + mod : a - b;} inline void Mmul(int &a, int b) {a = 1ll * a * b % mod;} inline int neg(int x) {return !x ? 0 : mod - x;} inline int norm(i64 x) {return (x % mod + mod) % mod;} template <typename ...Args> inline int Cadd(int a, int b, Args ...args) {return Cadd(Cadd(a, b), args...);} template <typename ...Args> inline int Cdel(int a, int b, Args ...args) {return Cdel(Cdel(a, b), args...);} template <typename ...Args> inline int Cmul(int a, int b, Args ...args) {return Cmul(Cmul(a, b), args...);} template <typename ...Args> inline void Madd(int &a, int b, Args ...args) {Madd(a, b), Madd(a, args...);} template <typename ...Args> inline void Mdel(int &a, int b, Args ...args) {Mdel(a, b), Mdel(a, args...);} template <typename ...Args> inline void Mmul(int &a, int b, Args ...args) {Mmul(a, b), Mmul(a, args...);} inline int ksm(int a, i64 b, int Mod = mod) {int ans = 1; for (; b; b >>= 1, a = 1ll * a * a % Mod) if (b & 1) ans = 1ll * ans * a % Mod; return ans;}}using namespace MTool;
vc<int> p, tim;void ins(int x, int id) { for (int i = 5; i >= 0; i--) if (x >> i & 1) { if (!p[i]) { p[i] = x, tim[i] = id; return ; } else if (tim[i] < id) { swap(p[i], x), swap(tim[i], id); } x ^= p[i]; }}vc<int> pw;
void solve() { int n, q; cin >> n >> q; vc<int> a(n); for (int i = 0, x; i < n; i++) { cin >> x; while (x != 1) { a[i]++; x /= mn[x]; } } debug(a);
vc<int> sum(n); for (int i = 0; i < n; i++) sum[i] = (i ? sum[i - 1] : 0) + (a[i] == 1); vc<int> rsum(n); for (int i = 0; i < n; i++) rsum[i] = (i ? rsum[i - 1] : 0) + (a[i] == 0);
vc<int> ans(q); vc<vc<array<int, 2>>> ask(n);
for (int i = 0; i < q; i++) { int l, r; cin >> l >> r; l--, r--; int rc = rsum[r] - (l ? rsum[l - 1] : 0), c = sum[r] - (l ? sum[l - 1] : 0); Madd(ans[i], pw[r - l + 1]); Mdel(ans[i], 1); if (!c) Madd(ans[i], Cdel(pw[rc], 1)); else Mdel(ans[i], 1); ask[r] += {l, i}; } p.assign(6, 0), tim.assign(6, -1); for (int i = 0; i < n; i++) { ins(a[i], i); for (auto [l, id] : ask[i]) { int c = 0; for (int j = 0; j <= 5; j++) if (tim[j] >= l) c++; Mdel(ans[id], Cdel(pw[i - l + 1 - c], 1)); } } for (int i = 0; i < q; i++) cout << ans[i] << '\n';}
void main01() { #ifdef LOCAL file(""); #endif cin.tie(nullptr) -> sync_with_stdio(false); init(1e7); pw.resize(1000005); pw[0] = 1; for (int i = 1; i < sz(pw); i++) pw[i] = Cadd(pw[i - 1], pw[i - 1]); int t = 1; cin >> t; while (t--) solve();}}signed main() {return Anonyme::main01(), 0;}
十六行诗
void solve() { int n; cin >> n; V<int> a(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i]; } V<int> tmp = a; remDup(tmp); int d = tmp.size(); auto get = [&](int x) { return (lower_bound(tmp.begin() + 1, tmp.end(), x) - (tmp.begin())); }; for (int i = 1; i <= n; i++) { a[i] = get(a[i]); } V<V<int>> nxt(n + 2, V<int>(d + 1, n + 1)); for (int v = 1; v <= d; v++) { nxt[n + 1][v] = n + 1; } for (int i = n; i >= 1; i--) { for (int v = 1; v <= d; v++) { nxt[i][v] = nxt[i + 1][v]; } nxt[i][a[i]] = i; } V<int> dp(n + 2, 0); for (int i = n; i >= 1; i--) { dp[i] = dp[i + 1]; int j = nxt[i + 1][a[i]]; if (j <= n) { for (int b = 1; b <= d; b++) { int k = nxt[j + 1][b]; if (k > n) { continue; } int l = nxt[k + 1][b]; if (l > n) { continue; } dp[i] = max(dp[i], 1 + dp[l + 1]); } } for (int j = i + 1; j <= n; j++) { int k = nxt[j + 1][a[i]]; if (k > n) { continue; } int l = nxt[k + 1][a[j]]; if (l > n) { continue; } dp[i] = max(dp[i], 1 + dp[l + 1]); } for (int j = i + 1; j <= n; j++) { int k = nxt[j + 1][a[j]]; if (k > n) { continue; } int l = nxt[k + 1][a[i]]; if (l > n) { continue; } dp[i] = max(dp[i], 1 + dp[l + 1]); } } cout << dp[1] << endl;}
Yuhina City
void solve() { int n, m, q; n = read(), m = read(), q = read(); vector<ll> r(n + 1); for (int i = 1; i <= n; i++) r[i] = read_ll();
vector<vector<pair<int, int>>> g(n + 1); for (int i = 1; i <= m; i++) { int u, v, w; u = read(), v = read(), w = read(); g[u].emplace_back(v, w); g[v].emplace_back(u, w); }
{ priority_queue<pair<ll, int>, vector<pair<ll, int>>, less<pair<ll, int>>> q; for (int i = 1; i <= n; i++) q.push({r[i], i});
while (!q.empty()) { auto [d, u] = q.top(); q.pop(); if (r[u] != d) continue; for (auto [v, w] : g[u]) { if (d - w > r[v]) { r[v] = d - w; q.push({r[v], v}); } } } } vector<ll> k(r); sort(k.begin(), k.end()); k.erase(unique(k.begin(), k.end()), k.end());
auto check = [&](int u, int v, ll f, int k) -> int { vector<int> dist(n + 1, infi); dist[u] = r[u] > f; deque<pair<int, int>> que; que.push_back({dist[u], u});
while (!que.empty()) { auto [d, u] = que.front(); que.pop_front(); if (dist[u] != d) continue; for (auto [v, _] : g[u]) { int w = r[v] > f; if (dist[v] > d + w) { dist[v] = d + w; if (w) que.push_back({dist[v], v}); else que.push_front({dist[v], v}); } } } return dist[v] <= k; };
while (q--) { int u, v, c; u = read(), v = read(), c = read(); int left = 0, right = k.size() - 1; ll ans = -1; while (left <= right) { int mid = left + (right - left) / 2; if (check(u, v, k[mid], c)) { ans = k[mid]; right = mid - 1; } else { left = mid + 1; } } Print(ans, '\n'); } Write();}
So Far Away
void solve() { int n, q; cin >> n >> q;
vc<int> a(n); for (auto &x : a) cin >> x; set<array<int, 2>> s; for (int i = 0; i < n; i++) s.insert({a[i], i});
vc<int> idx(n, -1); while (q--) { int op; cin >> op; if (op == 1) { int x, w; cin >> x >> w; x--; s.erase({a[x], x}); a[x] = w; s.insert({a[x], x}); } else { int u, v, k; cin >> u >> v >> k; u--, v--;
vc<int> pos; pos += u, pos += v; idx[u] = 0, idx[v] = 1; for (auto [d, i] : s) if (i != u && i != v) { idx[i] = sz(pos), pos += i; if (sz(pos) == 12) break; }
int m = sz(pos); vc<vc<int>> f(m, vc<int> (m, inf32)); for (int i = 0; i < m; i++) for (int j = 0; j < m; j++) f[i][j] = min(a[pos[i]], a[pos[j]]);
for (int i = 0; i < m; i++) f[i][i] = 0; for (int i = 0; i < k; i++) { int x, y; cin >> x >> y; x--, y--; if (idx[x] == -1 || idx[y] == -1) continue; f[idx[x]][idx[y]] = f[idx[y]][idx[x]] = inf32; } for (int i = 0; i < m; i++) for (int j = 0; j < m; j++) for (int k = 0; k < m; k++) ckmin(f[j][k], f[j][i] + f[i][k]);
cout << f[0][1] << '\n'; for (int i = 0; i < sz(pos); i++) idx[pos[i]] = -1; } }}
MEX Should Be Same
void solve() { int n; cin >> n; V<V<int>> b(n, V<int>(n, 0)); int cnt = 0; for (auto &x : b) { cin >> x; } for (auto &x : b) { for (auto &y : x) { if (y == 0) { cnt++; } } } int maxx = div<int>(n * n, 2, flase); int ok = (cnt <= maxx ? 1 : 0); for (auto &x : b) { for (auto &y : x) { if ((ok and y == 0) or (ok == 0 and y)) { y = ok; } } } for (auto &x : b) { cout << x << endl; }}
LRU is Best? (Hard Version)
#include <bits/stdc++.h>using namespace std;using i64 = long long;
const int MAXN = 800 * 3;const i64 INF = 1e18;
struct Edge { int to, cap, cost, rev;};
vector<Edge> G[MAXN];i64 dist[MAXN];int prevv[MAXN], preve[MAXN];
// 添加边的函数void add_edge(int from, int to, int cap, int cost) { G[from].push_back({to, cap, cost, (int)G[to].size()}); G[to].push_back({from, 0, -cost, (int)G[from].size() - 1});}
// 求解最大费用流pair<int, i64> min_cost_flow(int s, int t, int f) { int flow = 0; i64 cost = 0; while (flow < f) { fill(dist, dist + MAXN, -INF); dist[s] = 0; bool update = true; while (update) { update = false; for (int v = 0; v < MAXN; v++) { if (dist[v] == -INF) continue; for (int i = 0; i < G[v].size(); i++) { Edge &e = G[v][i]; if (e.cap > 0 && dist[e.to] < dist[v] + e.cost) { dist[e.to] = dist[v] + e.cost; prevv[e.to] = v; preve[e.to] = i; update = true; } } } }
if (dist[t] == -INF) { return {flow, cost}; }
int d = f - flow; for (int v = t; v != s; v = prevv[v]) { d = min(d, G[prevv[v]][preve[v]].cap); }
for (int v = t; v != s; v = prevv[v]) { Edge &e = G[prevv[v]][preve[v]]; e.cap -= d; G[v][e.rev].cap += d; cost += 1ll * d * e.cost; } flow += d; } return {flow, cost};}
int main() { cin.tie(nullptr)->sync_with_stdio(false);
int t; cin >> t; while (t--) { int n, m; cin >> n >> m; i64 ans = 0; vector<int> a(n + 1), x = a, y = a, z = a; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { cin >> x[i]; } for (int i = 1; i <= n; i++) { cin >> y[i]; ans -= y[i]; x[i] += y[i]; } for (int i = 1; i <= n; i++) { cin >> z[i]; } int tot = 0; vector<vector<int>> id(n + 1, vector<int>(n + 1)); for (int i = 1; i <= n; i++) { id[i] = id[i - 1]; id[i][0] = ++tot; id[i][a[i]] = ++tot; add_edge(id[i][a[i]], id[i][0], 1, 0); add_edge(id[i][0], id[i][a[i]], 1, -z[i]); if (i > 1) { add_edge(id[i - 1][0], id[i][0], m, 0); add_edge(id[i - 1][a[i]], id[i][a[i]], 1, x[i]); } } cout << ans + min_cost_flow(id[1][0], id[n][0], m).second << '\n'; for (int i = 1; i <= tot; i++) { G[i].clear(); } }}/*12 21 21 10 00 0*/
猫娘部署
void solve() { int n, m; cin >> n >> m; V<string> a(n); cin >> a; V<int> avi(n, 0); for (int i = 0; i < n; i++) { int so = 0; for (int j = 0; j < m; j++) { if (a[i][j] == 'Y') { so |= (1 << j); } } avi[i] = so; } V<V<int>> valid(n); V<V<int>> cnt(n); for (int i = 0; i < n; i++) { for (int j = 0; j < (1 << m); j++) { if ((j & avi[i]) != j) { continue; } if (j & (j << 1)) { continue; } valid[i].pb(j); } } int lim = (1 << m); V<V<int>> dp(n, V<int>(lim, -1)); for (auto x : valid[0]) { dp[0][x] = __builtin_popcount(x); } for (int i = 1; i < n; i++) { for (auto &x : valid[i]) { int cur = __builtin_popcount(x); for (auto &y : valid[i - 1]) { if (dp[i - 1][y] < 0) { continue; } if (x & y) { continue; } dp[i][x] = max(dp[i][x], dp[i - 1][y] + cur); } } }
int ans = 0; for (int i = 0; i < lim; i++) { ckmax(ans, dp[n-1][i]); } cout << ans << endl;}
混沌数字
#include <bits/stdc++.h>using namespace std;using i64 = long long;
int main() { cin.tie(nullptr)->sync_with_stdio(false);
// ifstream cin; // cin.open("0.in"); int n, m; cin >> n >> m; vector a(n, vector(m, int(0))); for (auto &t : a) { string s; cin >> s; for (int j = 0; j < m; j++) { t[j] = s[j] - '0'; } } // cin.close(); vector<int> fa(n * m), siz(n * m, 1); iota(fa.begin(), fa.end(), 0); auto find = [&](auto &find, int x) -> int { if (x == fa[x]) return x; return fa[x] = find(find, fa[x]); }; auto id = [&](int x, int y) -> int { return x * m + y; }; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (!a[i][j]) continue; if (i and a[i - 1][j]) { int fx = find(find, id(i - 1, j)); int fy = find(find, id(i, j)); if (fx == fy) continue; fa[fy] = fx; siz[fx] += siz[fy]; } if (j and a[i][j - 1]) { int fx = find(find, id(i, j - 1)); int fy = find(find, id(i, j)); if (fx == fy) continue; fa[fy] = fx; siz[fx] += siz[fy]; } } } string ans; for (int j = 0; j < m; j++) { for (int i = 0; i < n; i++) { if (!a[i][j]) continue; int cur = id(i, j); if (find(find, cur) != cur) continue; if (siz[cur] <= n * 2) continue; if (siz[cur] >= n * 15) ans.push_back('0'); else ans.push_back('1'); } } cout << ans << '\n';}/**/
SEU 2025 SUMMER PRETEST STD
https://mizuki.mysqil.com/posts/seu-2025-summer-pretest-std/