首页 > 其他分享 >Unusual Minesweeper 题解

Unusual Minesweeper 题解

时间:2024-07-14 13:41:08浏览次数:6  
标签:Unusual le int 题解 mid 炸弹 时间 Minesweeper 引爆

题目大意

给你 \(n\) 个炸弹,第 \(i\) 个炸弹在 \((x_i,y_i)\) 的位置,可以将这一行与这一列的距离小于 \(k\) 的其他所有炸弹引爆,而且连锁的引爆不需要时间。每一秒你可以引爆一个炸弹,其中第 \(0\) 秒也可以引爆,并且第 \(i\) 个炸弹在第 \(timer_i\) 的时候会自己爆炸。要求输出引爆所有炸弹的最小时间。

其中 \(1\le n \le 2\times 10^5,0\le k \le 10^9,-10^9\le x,y\le 10^9\)。

思路

因为炸弹爆炸的距离是一样的,所有对于任意的 \(x\) 可以引爆 \(y\),那么在 \(y\) 被引爆时 \(x\) 也会被引爆。

对于这个性质,在输入时可以将所有可以相互引爆的炸弹先预处理出来作为一个集合,同时计算出每个集合自己爆炸所需要的时间,这个操作可以通过并查集进行处理。

对于任意的 \(x\le y\):如果时间为 \(x\) 时可以全部引爆,那么在 \(y\) 这一时刻也一定可以。如果时间为 \(y\) 时不可以全部引爆,那么在 \(x\) 时刻也绝对不可能将炸弹全部引爆。

根据这个规律,我们可以发现时间与全部引爆的关系是有单调性的,所以这个题目可以使用二分进行求解。

假设二分的时间为 \(mid\)。如果这一组炸弹自己爆炸的时间 \(\le mid\),那么在规定时间到达前就会自己爆炸,所以并不需要人为的引爆。反之,如果这一组爆炸的时间 \(> mid\),那么就需要将这一组进行人为的引爆。

因为在时间为 \(0\) 时也可以引爆炸弹,所以如果时间为 \(mid\),那么实际上是可以手动引爆 \(mid+1\) 组炸弹的。

二分的复杂度为 \(O(\log n)\),\(check\) 函数的复杂度为 \(O(n)\),总时间复杂度为 \(O(n\log n)\)。

AC Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m,fa[N],s[N],x[N],y[N];
struct node{
	int x,y,id;
}a[N];
bool vis[N];
bool cmp1(node a,node b){
	if(a.x==b.x){
		return a.y<b.y;
	}
	return a.x<b.x;
}
bool cmp2(node a,node b){
	if(a.y==b.y){
		return a.x<b.x;
	}
	return a.y<b.y;
}
int find_root(int x){
	if(fa[x]==x){
		return x;
	}
	return fa[x]=find_root(fa[x]);
}
bool ck(int mid){
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++){
		if(s[find_root(i)]>mid){
			vis[find_root(i)]=1;
		}
	}
	int sum=0;
	for(int i=1;i<=n;i++){
		sum+=vis[i];
	}
	return sum<=mid+1;
}
void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].y>>s[i];
		a[i].id=i;
		fa[i]=i;
	}
	sort(a+1,a+1+n,cmp1);
	a[0].x=a[0].y=-1e9-1;
	for(int i=1,p=0;i<=n;i++){
		if(a[i].x==a[i-1].x&&abs(a[i].y-a[i-1].y)<=m){
			int x=find_root(a[i].id),y=find_root(a[i-1].id);
			if(x!=y){
				fa[y]=x;
				s[x]=min(s[x],s[y]);
			} 
		}
	}
	sort(a+1,a+1+n,cmp2);
	for(int i=1,p=0;i<=n;i++){
		if(a[i].y==a[i-1].y&&abs(a[i].x-a[i-1].x)<=m){
			int x=find_root(a[i].id),y=find_root(a[i-1].id);
			if(x!=y){
				fa[y]=x;
				s[x]=min(s[x],s[y]);
			} 
		}
	}
	int l=0,r=n,ans=-1;
	while(l<=r){
		int mid=(l+r)/2;
		if(ck(mid)){
			r=mid-1;
			ans=mid;
		}
		else{
			l=mid+1;
		}
	}
	cout<<ans<<'\n';
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int T;
	cin>>T;
	while(T--){
		solve();
	}return 0;
} 

标签:Unusual,le,int,题解,mid,炸弹,时间,Minesweeper,引爆
From: https://www.cnblogs.com/liudagou/p/18301436

相关文章

  • [ARC115B] Plus Matrix 的题解
    题目大意给你一个\(n\timesn\)的数组\(C\),\(c_{i,j}=a_i+b_j\),求\(a\)数组与\(b\)数组,不保证有解,其中\(1\len\le500,1\lec_{i,j}\le10^9\),而且\(a_i,b_i\)都是非负整数。\[\begin{bmatrix}a_1+b_1&a_1+b_2&\cdots&a_1+b_{n-1}&a_1+b_n\\a_2+b_......
  • P2188 小Z的 k 紧凑数 题解
    题目传送门前置知识数位DP|记忆化搜索解法基础数位DP,与luoguP2657[SCOI2009]windy数类似,记录当前位置、上一位填的数码,接着记忆化搜索即可。需要注意的是有前导零时,此时不需要管相邻两位数字差的绝对值不超过\(k\)的限制。代码#include<bits/stdc++.h>usingn......
  • SP14887 GOODA - Good Travels 题解
    题目传送门前置知识Tarjan算法|最短路解法缩点后原图就成为了一个有向无环图,此时每个点最多被经过一次,故在求最长路的过程中可以将点权和边权混着转移。上篇题解用拓扑实现查找两点间最长路的做法正确性不会证,遂写了份Dijkstra求最长路。代码#include<bits/stdc++.h......
  • 【反悔贪心】P2949WorkSchedulingG+P4053[JSOI2007]建筑抢修题解
    这两天遇到了几个很神奇的题目——能反悔的贪心。赶紧记录一下。例1(用时一定模型)用时一定:每个任务完成的耗时都是一样的。题面:Luogu-P2949WorkSchedulingG大体思路是:先把所有任务按照截止时间从小到大排序,然后枚举,遇到一个能做任务的就把他做了,把他的贡献加入一个......
  • 题解:AT_abc362_c [ABC362C] Sum = 0
    很好写(15min解决)但不好讲(跟别人讲了20min)的写法QwQ……首先,咱先算出原式的范围。最小值(暂且记为\(k\))的公式就是:\[k=\sum_{i=1}^{N}L_i\]就是每一个最小可能值的和。同理,最大值(我记为\(w\))的公式就是:\[w=\sum_{i=1}^{N}R_i\]即最大可能值的和。算这玩意儿......
  • 【题解】洛谷 P10765 「CROI · R2」在相思树下 I
    I题意简述共\(T\)组测试数据。对于每一组测试数据,有初始数列,共\(n\)个元素,从\(1\)至\(n\)。给出\(k\)次操作。操作一:将数列中下标为奇数的数全部删除;操作二:将数列中下标为偶数的数全部删除。完成操作之后,将剩余的数从下标\(1\)开始依次重新编排下标。求问\(k\)次......
  • 题解:Codeforces CF1613C Poisoned Dagger
    标签:二分题意给定一个长度为\(n\)的序列\(a\),定义数\(k\),对于\(i>1\),如果\(a_i-a_{i-1}<k\),\(s\)加上\(a_i-a_{i-1}\),否则加上\(k\),求满足\(s\geqh\)的最小\(k\)。思路手玩样例,\(k\)越大龙死的越快,所以具有单调性,考虑二分答案。每次缩小范围时判断是否\(k\g......
  • 洛谷 P6522 [CEOI2010 day2] tower 题解
    [CEOI2010day2]tower题目背景古巴比伦人决定建造一座塔。题目描述这座塔共有\(n\)层,每层由一个边长为\(a_i\)的立方体石块构成。一个石块\(i\)能够直接放在石块\(j\)上当且仅当\(a_i\leqa_j+D\),其中\(D\)为一个给定的常数。你需要求出如果使用全部的石块,有多......
  • 洛谷 P2478 [SDOI2010] 城市规划 题解
    题意简述仙人掌上求至少间隔两个位置的最大独立集。(仙人掌指,没有一条边在两个或以上的环里的无向图。)题目分析仙人掌就是树套环,即树上每个结点都是一个结点或环。那么将题目拆解成树上DP和环上DP即可。用tarjan缩点即可。树上DP先来看看树上DP。显然每个点有三个状......
  • [ZJOI2006] 三色二叉树 题解
    [ZJOI2006]三色二叉树题解link趣题。首先我们把题目分成两部分:建树和dp求解。建树:观察发现,字符串中的第\(i\)个字符就代表图中的第\(i\)个节点。如果\(S_i=0\),直接跳过;如果\(S_i=1\),那么\(i+1\)是\(i\)唯一的子节点,在两点之间连边,然后继续递归建树即可。......