CF85E Guard Towers

二分+染色


代码

//By AcerMo%%%尹兄 
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=5005;
const int mod=1e9+7;
int n,mid,ans;
int x[M],y[M];
bool vis[M],col[M];
inline int read()
{
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch<='9'&&ch>='0') x=x*10+ch-'0',ch=getchar();
	return x;
} 
inline int dis(int i,int k)
{
	return abs(x[i]-x[k])+abs(y[i]-y[k]);
}
inline bool dfs(int x)
{
	vis[x]=1;
	for (int i=1;i<=n;i++)
	if (i!=x&&dis(i,x)>mid)
	{
		if (!vis[i])
		{
			col[i]=!col[x];
			if (dfs(i)) return 1;
		}
		else if (col[i]==col[x]) return 1;
	}
	return 0;	
}
inline bool check()
{
	memset(vis,0,sizeof(vis));
	for  (int i=1;i<=n;i++)
		if (!vis[i]) 
			if (dfs(i)) return 0;
	return 1;
} 
inline void sfd(int x)
{
	vis[x]=1;
	for (int i=1;i<=n;i++)
		if (!vis[i]&&dis(i,x)>ans)
			sfd(i);
	return ;
}
inline long long int fpow(long long int a,int b)
{
	long long int ans=1;
	for (;b;a=(a*a)%mod,b>>=1)
		if (b&1) ans=(ans*a)%mod;
	return ans%mod;
}
int main()
{
	n=read();int que=0;
	for (int i=1;i<=n;i++)
		x[i]=read(),y[i]=read();
	int r=10000,l=0;
	while (l<=r)
	{
		mid=(l+r)>>1;
		if (check()) ans=mid,r=mid-1;
		else l=mid+1;
	}
	memset(vis,0,sizeof(vis));
	for (int i=1;i<=n;i++)	
		if (!vis[i]) sfd(i),que++;
	cout<<ans<<endl<<fpow(2,que);
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/80991167