题目传送门
题目大意
输入一个n*m的矩阵,每个格子里都有一个[1,10910910^9]的正整数。再输入T个整数titit_i,对于每个titit_i,输出矩阵中大于ti的数组成了多少个联通块(上下左右相连,斜着不联通)。
有Z组数据
数据范围
1≤n,m≤1000
0≤t1≤t2≤···≤tT≤10910910^9
1≤T≤10510510^5
0≤Z≤20

【题解】
首先想到暴力方法,对于每个titit_i,进行遍历,时间复杂度O(ZTnm),完全Tle

然后我发现可以利用0≤t1t1t_1≤t2t2t_2≤···≤tTtTt_T≤10910910^9这一性质,用离线的方法。
而且我发现,titit_i越小,联通块的总面积是越大的,而且是从ti+1ti+1t_{i+1}的联通块发展过来的,那么就倒序扫t数组,同时扩散联通块

然后我发现扫t的过程中很难确定到底矩阵中那个数大于titit_i,由于titit_i范围可以到10910910^9,不能开桶,所以想到对矩阵中的数进行排序
排序可以把矩阵拉成一个序列进行排序,排序之前记录好每个数的坐标即可
然后从大到小扫矩阵中的数,同时跟一个j,表示当前的数x,是满足tjtjt_j< x< tj+1tj+1t_{j+1}的,同时再跟一个ans,初始化为0,然后每进一个数,ans+1,用并查集进行合并,若四周的数大于tjtjt_j,而且两数属于不同的块,那么合并、ans-1

分析时间复杂度:O(Z(nmlog(nm)+nmα(nm)+T))其中α为并查集常数,很小

Code:

vara:array[0..2000000] of recordx,y,num:longint;end;s:array[0..1000,0..1000] of recordnum,x:longint;end;b,f,print:array[0..2000000] of longint;p,q,n,m,ans,x,y,z,i,j,k,t,sum1,sum2:longint;dx:array[1..4] of longint = (-1,0,0,1);dy:array[1..4] of longint = (0,-1,1,0);function get(k:longint):longint;beginif f[k] <> k then f[k] := get(f[k]);get := f[k];
end;procedure swap(var x,y:longint);
vartmp:longint;begintmp := x; x := y; y := tmp;
end;procedure sort(l,r:longint);
vari,j,mid:longint;begini := l; j := r; mid := a[(l + r) >> 1].num;repeatwhile a[i].num > mid do inc(i);while a[j].num < mid do dec(j);if i <= j thenbeginswap(a[i].x,a[j].x);swap(a[i].y,a[j].y);swap(a[i].num,a[j].num);inc(i); dec(j);end;until i > j;if i < r then sort(i,r);if l < j then sort(l,j);
end;beginreadln(q);for p := 1 to q dobeginreadln(n,m);for i := 1 to n dobeginfor j := 1 to m dobeginx := (i - 1) * m + j;read(a[x].num);a[x].x := i; a[x].y := j;end;readln;end;sort(1,n * m);for i := 1 to n * m dobegins[a[i].x][a[i].y].num := a[i].num;s[a[i].x][a[i].y].x := i;end;readln(t);for i := 1 to t do read(b[i]);for i := 1 to n * m do f[i] := i;ans := 0; j := t; a[n * m + 1].num := 0;for i := 1 to n * m + 1 dobeginwhile a[i].num <= b[j] dobeginprint[j] := ans;dec(j);if j = 0 then break;end;if j = 0 then break;inc(ans);for k := 1 to 4 dobeginx := a[i].x + dx[k];y := a[i].y + dy[k];if (x < 1) or (y < 1) or (x > n) or (y > m) then continue;if s[x][y].num > b[j] thenbeginsum1 := get(s[x][y].x); sum2 := get(i);if sum1 <> sum2 thenbeginf[sum1] := sum2;dec(ans);end;end;end;end;for i := 1 to t do write(print[i],' ');writeln;end;
end.

【题解】UVa1665:Islands相关推荐

  1. UVA1665 Islands (并查集)

    补题,逆序考虑每个询问的时间,这样每次就变成出现新岛屿,然后用并查集合并统计.fa = -1表示没出现. 以前写过,但是几乎忘了,而且以前写得好丑的,虽然常数比较小,现在重新写练练手.每个单词后面都要 ...

  2. 一句话以上题解及注意事项整理已完成的题目(1)

    jdfz.com 1001 A+B 1006 pla 一维DP+单调栈优化 1007 美食家 贪心策略,尽可能多选 1008 牛排序 二分查找+贪心策略 1009 护花 贪心策略,每次移动y/x最大的 ...

  3. Islands and Bridges 题解

    Islands and Bridges Description 给定一些岛屿和一些连接岛屿的桥梁,大家都知道汉密尔顿路是访问每个岛屿一次的路线,在我们这个地图中,每个岛屿有个正整数的权值,表示这个岛屿 ...

  4. CSP 202203 题解:未初始化警告,出行计划,计算资源调度器,通信系统管理,博弈论与石子合并

    试题内容请前往CCF官网查看: CCF-CSP计算机软件能力认证考试 http://118.190.20.162/home.page CCF 官方题解请点击这里. 阅读本题解前,您应当了解下列知识: ...

  5. hihocoder #1138 : Islands Trave

    这道题一开始想的是用Dijkstra或者是SPFA算法来写,写好了以后提交,结果TLE了.当时写的时候就感觉每个节点更新的复杂度至少是 O(n) O(n) 级别的,再考虑到数据量有 N<=100 ...

  6. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  7. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  8. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  9. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

最新文章

  1. Cytoscape制作带bar图和pie图节点的网络图
  2. cassandra hbase_为什么选择Cassandra
  3. conda(pip) bad interpreter的解决办法
  4. 1.10.Flink DataStreamAPI(API的抽象级别、Data Sources、connectors、Source容错性保证、Sink容错性保证、自定义sink、partition等)
  5. MySQL数据库引擎详解
  6. c语言指着与数组,C语言指针与数组
  7. mysql pxc测试_Mysql同步机制 - PXC 压力测试 tpcc安装及使用
  8. ExtJs2.0学习系列(14)--Ext.TreePanel之第三式(可增删改的树)
  9. 从css3书写顺序引出来的border-radius参数
  10. git 提交代码的好习惯
  11. 190325每日一句
  12. 微信浏览器下载APK文件的实现方案
  13. python画圆饼图
  14. [机器学习基石]台大林轩田笔记1 -- The Learning Problem
  15. Encoder-Decoder综述理解(推荐)
  16. python中回车用什么表示_解释stdscr中的“ENTER”键(Python中的curses模块)
  17. SPSS多元线性回归残差分析的基本方法
  18. cocos android 播放视频,Cocos2d-x IOS 和Android播放视频
  19. 热辊的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. 本地pycharm连接到远程服务器(超级详细)

热门文章

  1. 继承的学习总结与感悟
  2. linux服务器修改字体,Linux  字体修改
  3. QT之远程控制对方电脑
  4. P2-前端基础-网页中的实体(转义字符)
  5. 申请实用新型专利的流程
  6. php curl模拟wss,使用Poco C++库创建websocket安全访问(wss)客户端
  7. 【电子工程师】示波器基础知识问答
  8. 解读 | 计算机视觉已超越人类眼睛?
  9. 博途v15模拟量转换_通过实例玩转博途之信号模块参数设置及模拟量输入转换举例...
  10. redis appendonly.aof文件损坏修复方法