2025CSP-S模拟赛41 比赛总结
2025CSP-S模拟赛41
| T1 | T2 | T3 | T4 |
|---|---|---|---|
| 20 WA | 27 WA | 70 TLE | - |
总分:107;排名:12/19。
T1 写假了,T2 写假了,T3 暴力,T4 忘打了。
T1 限速(speed)
比较智障。
就是你跑一遍 DSU,然后如果有 \(\ge k\) 的边直接统计贡献,否则把目前最大的边搞成 \(k\) 即可。自己手玩一下就能发现是对的。
#include <bits/stdc++.h>
#define il inline
#define int long long
using namespace std;
const int bufsz = 1 << 20;
char ibuf[bufsz], *p1 = ibuf, *p2 = ibuf;
#define getchar() (p1 == p2 && (p2 = (p1 = ibuf) + fread(ibuf, 1, bufsz, stdin), p1 == p2) ? EOF : *p1++)
il int read() {
int x = 0; char ch = getchar(); bool t = 0;
while (ch < '0' || ch > '9') {t ^= ch == '-'; ch = getchar();}
while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
return t ? -x : x;
}
const int INF = 0x3f3f3f3f3f3f3f3f;
const int N = 2e5 + 10;
int n, m, kk;
struct node {
int x, y, w;
il bool operator < (const node & cmp) const {
return w < cmp.w;
}
} e[N];
int fa[N];
il int getfa(int x) {
return x == fa[x] ? x : fa[x] = getfa(fa[x]);
}
signed main() {
freopen("speed.in", "r", stdin);
freopen("speed.out", "w", stdout);
n = read(), m = read(), kk = read();
for (int i = 1; i <= m; i++) {
int x = read(), y = read(), w = read();
e[i] = {x, y, w};
}
sort(e + 1, e + 1 + m);
for (int i = 1; i <= n; i++) fa[i] = i;
int ans = 0, fl = 0, mn = INF;
for (int i = 1; i <= m; i++) {
int x = getfa(e[i].x), y = getfa(e[i].y);
if (x != y) {
fa[y] = x;
if (e[i].w > kk) ans += e[i].w - kk, fl = 1;
}
mn = min(mn, abs(kk - e[i].w));
}
if (!fl) ans = mn;
printf("%lld\n", ans);
return 0;
}
T2 酒鬼(drunkard)
考试时没考虑到 \(p_i=1\) 的情况,然后 max 写假了,就没分了。
首先对于 \(p_i > 1\) 的情况是显然的,min 只能是 0 或 1,max 显然,随便搞一下即可。
然后你考虑有 \(p_i=1\) 的情况,可能这个人在点 1 待好久才走,就是他可能前面很多的 \(p_i=1\) 的线索都是不满足奇偶性的,然后就是加一堆特判去搞他就完了。
他妈的这种全是 if 的代码的题出出来纯恶心人,真他妈的傻逼。
#include <bits/stdc++.h>
#define il inline
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
int n, m;
char op[5];
struct node {
int p, q;
il bool operator < (const node & cmp) const {
return q < cmp.q;
}
};
set<node> st;
int fl1 = 0;
il bool check(node a, node b) {
if (a.p == 1 && a.q <= fl1) a.q = fl1;
if (a.p > 1 && a.q <= fl1) return true;
if (b.p > 1 && b.q <= fl1) return true;
if (b.q - a.q < abs(a.p - b.p) || (b.q - a.q) % 2 != abs(a.p - b.p) % 2) {
if (a.p == 1 && b.p == 1) {
if (a.q <= fl1 && fl1 < b.q) fl1++;
else if (a.q >= fl1 && fl1 < b.q) fl1 = a.q + 1;
else fl1 = max(fl1, b.q);
return false;
}
if (a.p == 1 && b.q > fl1) {
fl1 = max(fl1, a.q + ((b.q - a.q) % 2 != abs(a.p - b.p) % 2));
return false;
}
return true;
}
return false;
}
int main() {
freopen("drunkard.in", "r", stdin);
freopen("drunkard.out", "w", stdout);
ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
cin >> n >> m;
int fl = 0;
set<node>::iterator it, it1, it2;
int pos = INF, tim = INF;
while (m--) {
cin >> op;
if (op[0] == 'c') {
int p, q;
cin >> p >> q;
if (p > q + 1) {
fl = 1;
continue;
}
node tmp = {p, q};
it = st.find(tmp);
if (it != st.end()) {
if ((*it).p != p) fl = 1;
continue;
}
st.insert(tmp);
it1 = it2 = it = st.find(tmp);
if (it != st.begin()) fl |= check(*(--it1), *it);
if (++it2 != st.end()) fl |= (check(*it, *it2));
if (p > 1 && q < tim) {
pos = p;
tim = q;
}
} else if (op[1] == 'i') {
if (fl) {
cout << "bad\n";
continue;
}
if (st.empty()) {
cout << 0 << "\n";
} else {
cout << max(((*st.begin()).q - (*st.begin()).p + 1) % 2, fl1) << "\n";
}
} else {
if (fl) {
cout << "bad\n";
continue;
}
if (pos == INF) {
cout << "inf\n";
continue;
}
cout << tim - pos + 1 << "\n";
}
}
return 0;
}

浙公网安备 33010602011771号