这是题解
我的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);
}