首页 > 其他分享 >POI2007POW-The Flood

POI2007POW-The Flood

时间:2024-04-15 19:48:54浏览次数:17  
标签:POI2007POW get int rep yy Flood fa id

POI #Year2007 #并查集 #贪心

按高度从小到大按顺序考虑每个点,将同样高度的点按顺序全部合并完,然后再遍历这些同样大小的点,如果一个点为关键点且它的联通块中没有抽水机,那么这个位置联通块的最低位置放一个抽水机

可以证明这个贪心是最优的

// Author: xiaruize
const int N = 1e3 + 10;

int n, m;
struct node
{
	int x, y;
	int d;
} s[N * N];
int a[N][N];
int fa[N * N];
bool vis[N * N];
const int dx[4] = {1, -1, 0, 0};
const int dy[4] = {0, 0, 1, -1};

int id(int x, int y)
{
	return (x - 1) * m + y;
}

int get(int x)
{
	if (fa[x] == x)
		return x;
	return fa[x] = get(fa[x]);
}

bool cmp(node a, node b)
{
	return a.d < b.d;
}

void solve()
{
	cin >> n >> m;
	rep(i, 1, n)
	{
		rep(j, 1, m)
		{
			cin >> a[i][j];
			s[id(i, j)] = {i, j, abs(a[i][j])};
			fa[id(i, j)] = id(i, j);
		}
	}
	sort(s + 1, s + n * m + 1, cmp);
	int res = 0;
	rep(i, 1, n * m)
	{
		int r = i;
		while (s[r].d == s[i].d)
			r++;
		r--;
		rep(j, i, r)
		{
			auto [x, y, d] = s[j];
			rep(dir, 0, 3)
			{
				int xx = x + dx[dir], yy = y + dy[dir];
				if (xx < 1 || yy < 1 || xx > n || yy > m)
					continue;
				if (abs(a[xx][yy]) > abs(a[x][y]))
					continue;
				vis[get(id(xx, yy))] |= vis[get(id(x, y))];
				fa[get(id(x, y))] = get(id(xx, yy));
			}
		}
		rep(j, i, r)
		{
			auto [x, y, d] = s[j];
			if (a[x][y] > 0 && !vis[get(id(x, y))])
			{
				vis[get(id(x, y))] = true;
				res++;
			}
		}
		i = r;
	}
	cout << res << endl;
}

#ifndef ONLINE_JUDGE
bool end_of_memory_use;
#endif

signed main()
{
	// freopen(".in","r",stdin);
	// freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int testcase = 1;
	// cin >> testcase;
	while (testcase--)
		solve();
#ifndef ONLINE_JUDGE
	cerr << "Memory use:" << (&end_of_memory_use - &start_of_memory_use) / 1024.0 / 1024.0 << "MiB" << endl;
	cerr << "Time use:" << (double)clock() / CLOCKS_PER_SEC * 1000.0 << "ms" << endl;
#endif
	return 0;
}

标签:POI2007POW,get,int,rep,yy,Flood,fa,id
From: https://www.cnblogs.com/xiaruize/p/18136786

相关文章

  • (算法)Lake Counting <Flood Fill 洪水灌溉模型>
    题目:题解:#include<stdio.h>intn,m;chararr[110][110];//元数据数组intcount=0;//计数器intdx[8]={1,1,1,-1,-1,-1,0,0};intdy[8]={-1,0,1,-1,0,1,1,-1};intt[110][110];//判断是否被选择voiddfs(intx,inty){for(inti=0;i<......
  • 十四 687. 扫雷 (Flood Fill)
    687.扫雷(FloodFill)思路:首先处理读取的网格str数组为g数组,若为地雷,则对应位置为-1,否则对应位置为以当前位置作为中心九宫格内地雷数量。然后遍历新数组g,若为0,则点击次数加一,再使用DFS处理当前位置即周围九宫格,若也为0继续DFS,所有搜索过的位置都标记为-1,最后再遍历一遍数组g......
  • 蓝桥杯算法集训 - Week 4:BFS、并查集、Flood Fill、哈希、单调栈/队列
    蓝桥杯算法集训-Week4本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、BFSBFS算法复习参考:BFS(Java)广度优先搜索简单介绍、模板、案例(一)Ⅰ、代码模板staticvoidbfs(Troot){//双端队列,用来存储元素D......
  • Flood Fill
    好习惯:先看样例,直接手模。手摸完第一个样例我们会发现:当两个值不一样的连通块相邻时,我们若翻转其中一个,再翻转另外一个的时候,与直接翻转另外一个没有区别。举个例子:010我们先翻转1,变成了000,此时我们再翻转000则变成了111。与直接翻转010两边的0变成111没有任何区......
  • IOI 2007 Flood
    有一些墙壁链接(ax,ay),(bx,by)每次若有墙壁的两边一个有水,一个为空,墙壁就破了然后水开始充了起来找出最后还存在的墙壁 首先我们可以看出来墙壁的两边是可以用节点表示的我们需要合并一些区间什么的,听说这一题有些人利用对偶图来求但是我不会可以自己想想怎么样合并/哪......
  • 【图论#02】岛屿数量,flood fill算法的代码实现与优化
    岛屿数量给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[["1","1","1","1","0"],["1","1"......
  • SYN Flood攻击原理,SYN Cookie算法
    SYNFlood是一种非常危险而常见的Dos攻击方式。到目前为止,能够有效防范SYNFlood攻击的手段并不多,SYNCookie就是其中最著名的一种。SYNFlood攻击原理SYNFlood攻击是一种典型的拒绝服务(DenialofService)攻击。所谓的拒绝服务攻击就是通过进行攻击,使受害主机或网络不能提供良好......
  • 利用Kali进行简单的 SYN FLOOD 攻击测试
    本文实验旨在简单介绍下使用kali的自带工具hping3进行SYNFLOOD(属于典型的DOS/DDOS攻击)测试攻击,实验环境均在VMware虚拟机内,并无涉及真实IP地址。若因传播或利用本文所提供的信息而造成任何直接或间接的后果,均由使用者本人负责,作者不为此承担任何责任!打开Kali虚拟机后,进入管理......
  • [OpenCV] 漫水填充floodFill (类似于photoshop的智能填充)
    两个函数重载:CV_EXPORTSintfloodFill(InputOutputArrayimage,PointseedPoint,ScalarnewVal,CV_OUTRect*rect=0,ScalarloDiff=Scalar(),ScalarupDiff=Scalar(),intflags......
  • 2023-04-01 图论问题建模和floodfill
    图论问题建模和floodfillfloodfill(洪泛)实际就是图的遍历1图论问题例子:判断二分图题目来源:LeetCode785is-graph-bipartite:,判断二分图,因为题目中已经给出了邻接表,相当于已经给出了Graph,所以直接用二分图的核心算法即可,参考DFS实现二分图检测实现代码2图的建模和二......