这题就是考察什么时候建边,貌似和搜索没有半毛钱关系\(qwq\)
首先没有传感器的房间是可以随便走来走去的,因为我们不用考虑顺序。于是就考虑先把这些点的相互的边给建起来。
接下来分析一波,对于第\(i\)个得到信息的房间,我们绝对不能在此之前经过第\(i+1\) ~ \(k\)的房间。所以,除了这些房间,我们将其余所有连边,再判断第\(i-1\)个房间能否到\(i\)房间即可。
因为只要判断房间之间的连通性,用冰茶机来维护是再好不过了。
\(Code:\)
#include
using namespace std;
inline int read(){
register int s=0,f=1;
register char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f*=-1;ch=getchar();}
while(isdigit(ch))s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return s*f;
}
const int max_n=100000+5;
int a[max_n],par[max_n],vis[max_n];//par表示祖先,vis表示哪些点可以连
vectorNext[max_n];
int find(int x){
if(x==par[x])return x;//找到祖先
return par[x]=find(par[x]);//路径压缩
}
void merge(int x,int y){
x=find(x),y=find(y);//找祖先
if(x==y)return;//同一个祖先?大雾
par[y]=x;
}
void add(int x){//找所有和x联通并可以连边的点
for(int i=0;i
于是\(50\)行就切掉了这道紫题真香