这都快复制了,怎么就是不一样啊
查看原帖
这都快复制了,怎么就是不一样啊
501947
DengDuck鄧德楼主2023/5/18 07:20

这是题解

我的98pts代码

#include<bits/stdc++.h> 
#define LL int
using namespace std;
const int N=3e5+5;
LL n,k,l[N],r[N],pd;
vector<int>a[N],b[N];
void init(int n,int k)
{	
	for(int i=0;i<=n-1;i++)
	{
		l[i]=-1,r[i]=k;
	}
	for(int i=0;i<=k-1;i++)
	{
		l[i]=r[i]=i;
	}

}
bool work(LL,LL);
bool add(LL x)
{
	for(LL i:a[x])
	{
		if(work(x,i))return true;
	}
	for(LL i:b[x])
	{
		if(work(i,x))return true;
	}	
	return false;
}
bool work(LL x,LL y)
{
	if(x<k&&y<k)
	{
		return x>=y;
	}
	if(r[x]<l[y])return false;
	if(l[x]>r[y])return true;
	if(l[x]==l[y]&&r[x]==r[y])return false;
	LL midx=(l[x]+r[x])>>1,midy=(l[y]+r[y])>>1;
	if(l[x]<=l[y]&&r[y]<=midx)
	{
		r[x]=midx;
		return l[x]==r[x]||add(x);
	}	
	if(midy<l[x]&&r[x]<=r[y])
	{
		l[y]=midy+1;
		return l[y]==r[y]||add(y);
	}
	return false;
}

int add_teleporter(int x,int y)
{
	a[x].push_back(y),b[y].push_back(x);
	return work(x,y);
}
2023/5/18 07:20
加载中...