Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4Mobile wallpaper 5Mobile wallpaper 6
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();
}
}
}
/*
1
2 2
1 2
1 1
0 0
0 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/
作者
LANSGANBS
发布于
2025-05-20
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00