Au Revoir, icpc
Au Revoir, icpc
—— 永别了,icpc
今日天梯赛打得并不好,甚至没能进校前三,赛后 20s 发现是某个细节写错了。
具体是什么?
问题:有一块
的海洋,上面有一些岛屿,此外还有一些宝藏。求岛屿个数和宝藏岛屿个数(四联通)。 UPD: 有了正式链接之后,过了。
我写的是,首先将所有岛屿标为
(包括宝藏),然后求连通块个数。这是第一问,是没问题的。然后是将所有宝藏岛标记为 ,求连通块个数,这里有问题,因为也数了那些 的连通块。 我没注意到这个细节,以为是其他地方写挂了。然后就在删了写、写了删…… 太菜了是这样的
修正后的代码
#include <bits/stdc++.h> int main() { std::cin.tie(nullptr)->sync_with_stdio(false); int n, m; std::cin >> n >> m; int cnt = n * m; std::vector<std::string> mp(n); for (auto &i : mp) std::cin >> i, cnt -= std::count(i.begin(), i.end(), '0'); auto get = [&](int x, int y) { return x * m + y; }; std::vector<int> vis(n * m); std::vector<std::pair<int, int>> dir = { {1, 0}, {0, 1}, {-1, 0}, {0, -1}, }; std::function<void(int, int, char)> dfs = [&](int i, int j, char c) { if (vis[get(i, j)]) return; vis[get(i, j)] = 1; for (auto [dx, dy] : dir) { int px = i + dx; int py = j + dy; if (px < 0 || px >= n || py < 0 || py >= m) continue; if (mp[px][py] != '0') { mp[px][py] = c; dfs(px, py, c); } } }; auto counter = [&]() { static char c = '1'; int ans = cnt; std::vector<int> p(n * m); std::iota(p.begin(), p.end(), 0); std::function<int(int)> find = [&](int x) -> int { return p[x] = p[x] == x ? x : find(p[x]); }; auto merge = [&](int i, int j, int x, int y) { int X = find(get(i, j)); int Y = find(get(x, y)); if (X == Y) return 0; return p[Y] = X, 1; }; using pii = std::pair<int, int>; std::queue<pii> q; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mp[i][j] == c) q.emplace(i, j); } } while (!q.empty()) { auto [x, y] = q.front(); q.pop(); if (vis[get(x, y)]) continue; vis[get(x, y)] = 1; for (auto [dx, dy] : dir) { int px = dx + x, py = dy + y; if (px < 0 || px >= n || py < 0 || py >= m) continue; if (mp[px][py] == c) { ans -= merge(x, y, px, py); q.emplace(px, py); } } } c ++; return ans; }; auto restore = mp; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mp[i][j] >= '1' && !vis[get(i, j)]) dfs(i, j, '1'); } } vis = std::vector<int>(n * m); std::cout << counter() << ' '; vis = std::vector<int>(n * m); mp = restore; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mp[i][j] >= '2' && !vis[get(i, j)]) dfs(i, j, '2'); } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mp[i][j] == '1') { mp[i][j] = '0'; cnt -= 1; } } } vis = std::vector<int>(n * m); std::cout << counter() << '\n'; return 0; }
按照 /p/train-20230419.html#walk 中代码块最下方隐藏段落(鼠标悬停可见):
我要正式切割 ICPC 了。要专心去谈恋爱了捏( ̄▽ ̄)*
说起来心中十分不舍与愧疚,尤其是让其他团队的同学去参加我团队负责的 ICPC。我曾经的队友们一个已经退出 ACM,两个准备考研,一个已经找到可转正的实习。
怎么这么多队友?渣男!
大一的时候和两个 OIer 组队了,战绩是一个省赛铜奖。
之后一直到大三上,都是和另外两个 0 基础的一起组队,当然,我也是 0 基础.
平庸的成绩#
此外还有两个四川省赛铜,真正意义上的人菜瘾大。
我与 ICPC#
让我想想,是不是要来个时间线?其实也就是大一打学校的预选赛然后进入团队学习,期间觉得自己太菜了退过一段时间,后来打新生赛又回去了。
不想却是唯一一次线下比赛。
之后大二就不断学新算法,刷题,ojhunter 上数数有 ,可能很多重复的,提交有
这就够了。
要说 ICPC 给我带来了什么的话……
- 朋友。虽然大多是素未谋面的陌生网友。
- 挂科。甚至无法升入大四,果然应了那句 icpc + 娱乐 = 挂科 恒等式。不过不用担心,我下学期好好修读应该还是能 2024 年毕业的。
- C++ 知识。太多太多了,这也许对我的面试会有不小的帮助。甚至我打算从事 C++ 相关的工作。
- 真相。我如此弱的真相。
被单调队列了。
致谢#
特别感谢 @繁凡さん 允许我加入团队。
对一路上给予过我帮助的同学/网友们表示感谢。
感谢 ICPC,给我带来了如此快乐的大学生活。
作者:patricky
出处:https://www.cnblogs.com/patricky/p/icpc-au-revoir.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)