尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

csp-s 2025 随笔

csp-s 2025 随笔
📅 发布时间:2026/6/20 3:45:59

csp-s2025 T2

考场的时候把 $k<=10$ 看成 $k<=1e4$ 了,当时想了半天我说 CCF 怎么这次出的那么难呢,拿了个特殊性质 A 就跑了,你的这就算了吧,更可恶的是开二维数组 a[maxn][maxn](maxn=1e4+5)直接 MLE 了,于是乎:$48pts$ -> $0pts$,造孽啊......

思路非常简单,就是坑多了一点其它还好

首先对于特殊性质 A 敲一遍 kruskal 模板直接过掉,不会的去【模板】最小生成树,预期 $48$ 分

注意到 $k<=10$,我们直接暴力二进制枚举,对于每一次枚举都跑一遍 kruskal,时间复杂度 $O(2^k \cdot (kn+m)\log(kn+m))$,预期 $48$ 分

发现此时 $2^k$ 是肯定无法再优化了,我们知道对于很多最小生成树的题目都是去想 kruskal 的算法原理,而且对于图论有一个非常经典的思路就是把时间复杂度从关于 $m$ 的转移到关于 $n$ 的,于是容易发现对于只考虑原本城市的图不需要一直排序,可以直接预处理出原本城市的图最小的前 $n-1$ 条边,并在 kruskal 函数中只考虑乡镇的边和 $n-1$ 条城市的边,时间复杂度 $O(m\log m + 2^k (kn)\log(kn))$,预期 $80$ 分($n\log n$ 时间复杂度时 $n<=2e7$)

发现时限瓶颈卡在了排序给的 $\log$ 上,于是我们直接预处理排序,kruskal 函数里如果碰到不改造乡镇的边直接跳过即可,时间复杂度 $O(m\log m + kn\log kn + 2^k (kn))$,预期得分 $100$ 分

还有几个很坑的点:

  • 务必要开 long long,否则 $100 \to 16$
  • 务必要开快速读入,否则 $100 \to 96$
  • 务必要开 $1e18$ 而不是 0x3f3f3f3f,否则 $100 \to 16$

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e6 + 5;
int n, m, k, c[maxn], a[15][maxn], ans = 1e18;
bool change[maxn];inline int r() {int x = 0, f = 1;char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-') f = -1;ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + (ch - '0'); ch = getchar();}return f * x;
}struct Edge { int u, v, w; };
struct DSU {int fa[maxn];void init(int sz) {for (int i = 1; i <= sz; i++) fa[i] = i;}int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }bool merge(int x, int y) {x = find(x), y = find(y);if (x == y) return 0;fa[x] = y;return 1;}
}dsu;bool cmp(Edge x, Edge y) {if (x.w == y.w) return x.u < y.u;return x.w < y.w;
}int kruskal(vector<Edge> &edges) {int res = 0, num = 0;for (auto e : edges) {int u = e.u, v = e.v, w = e.w;if (v > n && !change[v - n]) continue;if (dsu.merge(u, v)) {res += w;num++;if (num >= n + k - 1) break;}}return res;
}signed main() {n = r(), m = r(), k = r();vector<Edge> olde;for (int i = 1; i <= m; i++) {int u = r(), v = r(), w = r();olde.push_back({u, v, w});}sort(olde.begin(), olde.end(), cmp);DSU dsu0;dsu0.init(n);int cnt = 0;vector<Edge> newe;for (auto e : olde) {if (dsu0.merge(e.u, e.v)) {newe.push_back(e);cnt++;if (cnt == n-1) break;}}vector<Edge> edges = newe; for (int i = 1; i <= k; i++) {c[i] = r();for (int j = 1; j <= n; j++) {a[i][j] = r();edges.push_back({j, n + i, a[i][j]});}}sort(edges.begin(), edges.end(), cmp);for (int i = 0; i < (1 << k); i++) {dsu.init(n + k); int cost = 0;for (int j = 0; j < k; j++) {change[j + 1] = (i >> j) & 1; cost += change[j + 1] * c[j + 1];}int mst_cost = kruskal(edges);ans = min(ans, mst_cost + cost);}cout << ans << endl;return 0;
}

相关新闻

  • 内网穿透配置和使用 - Rainbow
  • 13. Spring AI 的观测性 - Rainbow
  • Elasticsearch8.4.1升级Elasticsearch9.1.5 - 实践

最新新闻

  • 麻省理工研究人员打造 Fractal 操作系统,获苹果 M1 芯片新发现
  • React写的WebVR全景看房跳转demo,带贝壳式热点导航和视角控制
  • 2026年郑州脚手架搭建公司推荐:钢管脚手架/盘口脚手架搭建拆除、室内外装修架子搭设、脚手架租赁施工怎么选 - 海棠依旧大
  • 从PHP一句话木马到Webshell大马:攻防原理与实战防御指南
  • BepInEx IL2CPP启动失败:技术原理与完整解决方案指南
  • Elastic 被评为 IDC MarketScape《2026 年全球 SIEM 厂商评估》领导者

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号