题目链接
https://www.acwing.com/problem/content/4269/
思路因为n的范围为1k,那么我们可以提前将每一个点在d范围内的所有点存储起来,这个也就是一条还不清楚能否连接的边,我们再用一个 v i s [ i ] vis[i] vis[i]记录一下当前第i台电脑是否开机。关于这些电脑之间的关系我们可以通过并查集维护在同一个集合中的电脑,我们现在有两种操作:
- 'O’操作:将p电脑开机
- 'S’操作:查询p和q是否在一个集合中
那么前面提到了我们通过并查集维护这个数据关系,对于第一种操作,我们就将p电脑周围所有的开机的电脑合并(merge操作)并将当前的电脑标记为开机,对于第二种操作我们直接查询p电脑和q电脑是否是同一个集合中即可
代码#include
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair
#define INF 0x3f3f3f3f
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
ll ksm(ll a,ll b) {
ll ans = 1;
for(;b;b>>=1LL) {
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
}
return ans;
}
ll lowbit(ll x){return -x & x;}
const int N = 1e3+10;
//----------------自定义部分----------------
ll t,n,d,m,fa[N];
struct Point{
ll x,y;
};
vector V;
vector E[N];
bool vis[N];
ll find(ll x){
ll t = x;
while(t != fa[t]) t = fa[t];
while(x != fa[x]){
ll temp = fa[x];
fa[x] = t;
x = temp;
}
return x;
}
bool is_in(Point a,Point b){
ll x = (a.x - b.x),y = (a.y - b.y);
ll len = x * x + y * y;
return len x>>y;
V.push_back({x,y});
E[i].clear();
}
for(int i = 1;i op) {
ll u,v,k;
if(op == 'O'){
cin>>u;
k = find(u);
for(int i = 0,l = E[u].size();i >u>>v;
u = find(u),v = find(v);
if(u == v)
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?