沧海桑田

沧海桑田

![image-20240120152605055](C:\Users\Jianfan Li\AppData\Roaming\Typora\typora-user-images\image-20240120152605055.png)

注意到行数很少,考虑枚举行。

首先我们可以设定一个 fa 并查集数组,find(p)=find(q) 表示两个点在同一个连通块内(不限于陆地,海洋也可以),所以我们可以设一个 col 数组,表示当前这个点是在海洋还是在陆地,这样对于opt=1的情况,我们就可以很好的解决,只要满足

col[x1×N+y1]=1col[x2×N+y2]=1find(x1×N+y1)=find(x2×N+y2) 就可以了

然后看第二个东西,我们是要把一个区间变成陆地,那我们可以枚举行,对于每一行的操作,考虑跳跃的操作,再次设定 nxti,j 表示第 i 行第 j 列跳到的下一个海洋在哪一列,具体直接参考(染色问题)!

#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10, M = 50 * N; int fa[M], net[52][N], m; bool col[M]; int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0}; int find(int x) { if (x == fa[x]) return x; return fa[x] = find(fa[x]); } int getnext(int x, int y) { if (net[x][y] == y) return y; return net[x][y] = getnext(x, net[x][y]); } void access(int x, int y) { int p = (x - 1) * N + y; col[p] = 1; for (int i = 0; i < 4; i++) { int q = (x + dx[i] - 1) * N + (y + dy[i]); if (q < 1 || q > 50 * N || !col[q]) continue; fa[find(p)] = find(q); } } int main() { for (int i = 1; i <= M; i++) fa[i] = i; for (int i = 1; i <= 50; i++) for (int j = 1; j <= N; j++) net[i][j] = j; cin >> m; while (m--) { int opt, x1, y1, x2, y2; scanf("%d%d%d%d%d", &opt, &x1, &y1, &x2, &y2); if (opt) { int p = (x1 - 1) * N + y1, q = (x2 - 1) * N + y2; if (col[p] && col[q] && find(p) == find(q)) puts("1"); else puts("0"); } else { if (x1 > x2) swap(x1, x2); if (y1 > y2) swap(y1, y2); for (int i = x1; i <= x2; i++) { int x = getnext(i, y1); while (x <= y2) access(i, x), x = net[i][x] = getnext(i, x + 1); } } } return 0; }

__EOF__

本文作者ljfyyds
本文链接https://www.cnblogs.com/ljfyyds/p/17976567.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ljfyyds  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示