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;
}

T3 距离(distance)

T4 团队选拔(selection)

posted @ 2025-08-25 17:27  Zctf1088  阅读(36)  评论(0)    收藏  举报