WA 求助
查看原帖
WA 求助
779970
lunjiahao楼主2024/10/31 15:19

rt,从 AT_arc069_d 过来的

#include<bits/stdc++.h>
#define il inline
#define ls u<<1
#define rs u<<1|1
#define pb push_back
#define op(x) ((x)<=n?(x)+n:(x)-n)
#define clr(x) memset(x,0,sizeof(x))
using namespace std;
const int N=2e4+5;
int n;
struct dat
{
	int pos,id;
	bool operator < (const dat &b) const
	{
		return pos<b.pos;
	}
	dat(int pos=0):pos(pos){}
}flag[N];
int tot,id[N<<2];
vector<int> g[N];
void build(int u,int l,int r)
{
	id[u]=++tot;
	if(l==r) return g[id[u]].pb(op(flag[l].id)),void();
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	g[id[u]].pb(id[ls]);
	g[id[u]].pb(id[rs]);
}
void link(int u,int l,int r,int x,int y,int p)
{
	if(y<l||r<x) return;
	if(x<=l&&r<=y) return g[p].pb(id[u]),void();
	int mid=(l+r)>>1;
	if(x<=mid) link(ls,l,mid,x,y,p);
	if(y>mid) link(rs,mid+1,r,x,y,p);
}
int tc,cnt,low[N],dfn[N],bel[N];
bool vis[N];
stack<int> stk;
void Tarjan(int u)
{
	low[u]=dfn[u]=++tc;
	vis[u]=1,stk.push(u);
	for(auto v:g[u])
		if(!dfn[v]) Tarjan(v),low[u]=min(low[u],low[v]);
			else if(vis[v]) low[u]=min(low[u],dfn[v]);
	if(low[u]==dfn[u])
	{
		++cnt;
		do
		{
			bel[u]=cnt;
			u=stk.top(),stk.pop();
			vis[u]=0;
		}while(low[u]^dfn[u]);
	}
}
bool check(int x)
{
	cnt=tc=0;
	clr(low),clr(dfn),clr(bel);
	build(1,1,tot=2*n);
	for(int i=1;i<=2*n;i++) g[i].clear();
	for(int i=1;i<=2*n;i++)
	{
		int l=upper_bound(flag+1,flag+1+2*n,dat(flag[i].pos-x))-flag;
		int r=upper_bound(flag+1,flag+1+2*n,dat(flag[i].pos+x-1))-flag-1;
		link(1,1,2*n,l,i-1,flag[i].id);
		link(1,1,2*n,i+1,r,flag[i].id);
	}
	for(int i=1;i<=2*n;i++)
		if(!dfn[i]) Tarjan(i);
	for(int i=1;i<=n;i++)
		if(bel[i]==bel[i+n]) return false;
	return true;
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&flag[i].pos,&flag[i+n].pos);
			flag[i].id=i,flag[i+n].id=i+n;
		}
		sort(flag+1,flag+1+n*2);
		int l=0,r=flag[n*2].pos-flag[1].pos+1,ans=0;
		while(l<=r)
		{
			int mid=(l+r)>>1;
			if(check(mid)) ans=mid,l=mid+1;
				else r=mid-1;
		}
		printf("%d\n",ans);		
	}
	return 0;
}
2024/10/31 15:19
加载中...