题目描述

In a far away kingdom lives a very greedy king. To defend his land, he built n n n guard towers. Apart from the towers the kingdom has two armies, each headed by a tyrannical and narcissistic general. The generals can't stand each other, specifically, they will never let soldiers of two armies be present in one tower.

During defence operations to manage a guard tower a general has to send part of his army to that tower. Each general asks some fee from the king for managing towers. As they live in a really far away kingdom, each general evaluates his fee in the following weird manner: he finds two remotest (the most distant) towers, where the soldiers of his army are situated and asks for the fee equal to the distance. Each tower is represented by a point on the plane with coordinates (x,y) (x,y) (x,y) , and the distance between two points with coordinates (x1,y1) (x_{1},y_{1}) (x1​,y1​) and (x2,y2) (x_{2},y_{2}) (x2​,y2​) is determined in this kingdom as ∣x1−x2∣+∣y1−y2∣ |x_{1}-x_{2}|+|y_{1}-y_{2}| ∣x1​−x2​∣+∣y1​−y2​∣ .

The greedy king was not exactly satisfied with such a requirement from the generals, that's why he only agreed to pay one fee for two generals, equal to the maximum of two demanded fees. However, the king is still green with greed, and among all the ways to arrange towers between armies, he wants to find the cheapest one. Each tower should be occupied by soldiers of exactly one army.

He hired you for that. You should find the minimum amount of money that will be enough to pay the fees. And as the king is also very scrupulous, you should also count the number of arrangements that will cost the same amount of money. As their number can be quite large, it is enough for the king to know it as a remainder from dividing by 109+7 10^{9}+7 109+7 .

Two arrangements are distinct if the sets of towers occupied by soldiers of the first general are distinct.

输入输出格式

输入格式:

The first line contains an integer n n n ( 2<=n<=5000 2<=n<=5000 2<=n<=5000 ), n n n is the number of guard towers. Then follow n n n lines, each of which contains two integers x,y x,y x,y — the coordinates of the i i i -th tower (0<=x,y<=5000) (0<=x,y<=5000) (0<=x,y<=5000) . No two towers are present at one point.

Pretest 6 is one of the maximal tests for this problem.

输出格式:

Print on the first line the smallest possible amount of money that will be enough to pay fees to the generals.

Print on the second line the number of arrangements that can be carried out using the smallest possible fee. This number should be calculated modulo 1000000007 1000000007 1000000007 ( 109+7 10^{9}+7 109+7 ).

输入输出样例

输入样例#1:

2
0 0
1 1
输出样例#1:

0
2
输入样例#2:

4
0 0
0 1
1 0
1 1
输出样例#2:

1
4
输入样例#3:

3
0 0
1000 1000
5000 5000
输出样例#3:

2000
2

说明

In the first example there are only two towers, the distance between which is equal to 2. If we give both towers to one general, then we well have to pay 2 units of money. If each general receives a tower to manage, to fee will be equal to 0. That is the smallest possible fee. As you can easily see, we can obtain it in two ways.


二分判断是否是二分图;

二分集合里的最小值,把大于这个值的连上一条边,然后判断是否是二分图;

我因为没开long long调了一上午,生无可恋。


Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
const int mod = ; int n, X[], Y[];
int dis[][];
int color[];
int l = , r=1e6;
int bel[]; inline long long ksm(long long a, long long y)
{
int res = ;
while (y)
{
if (y & ) res = (res % mod * a % mod) % mod;
a = (a % mod * a % mod) % mod;
y >>= ;
}
return res % mod;
} bool dfs(int x, int col, int minn)
{
color[x] = col;
for (register int i = ; i <= n ; i ++)
{
if (x == i) continue;
if (dis[x][i] > minn)
{
if (color[i] == -)
{
if (!dfs(i, -col, minn)) return ;
}
else if (color[i] != - col) return ;
}
}
return ;
} inline bool check(int x)
{
memset(color, -, sizeof color);
for (register int i = ; i <= n ; i ++)
if (color[i] == -)
if (!dfs(i, , x)) return ;
return ;
} void dfs2(int x, int minn, int nu)
{
bel[x] = nu;
for (register int i = ; i <= n ; i ++)
{
if (i == x) continue;
if (bel[i]) continue;
if (dis[x][i] <= minn) continue;
dfs2(i, minn, nu);
}
} int main()
{
scanf("%d", &n);
for (register int i = ; i <= n ; i ++) scanf("%d%d",&X[i],&Y[i]);
for (register int i = ; i <= n ; i ++)
for (register int j = ; j <= n ; j ++)
dis[i][j] = abs(X[i]-X[j]) + abs(Y[i]-Y[j]);
int ans;
while (l < r)
{
int mid = l + r >> ;
if (check(mid)) r = mid;
else l = mid + ;
}
ans = l;
cout << ans << endl;
int tot = ;
for (register int i = ; i <= n ; i ++)
{
if (!bel[i]) tot++, dfs2(i, ans, tot);
}
cout << (ksm(, tot)) % mod;
return ;
}

最新文章

  1. Html&lt;a&gt;标签href的困惑记载
  2. 中文分词工具探析(一):ICTCLAS (NLPIR)
  3. MSDTC故障排除,DTCTester用法 (二)
  4. MYSQL 优化常用方法
  5. linux下svn命令大全
  6. Java API ——Scanner类
  7. php 上传视频的代码
  8. 2008r2 做windows域控制器
  9. C++中的继承详解(3)作用域与重定义,赋值兼容规则
  10. 关于阿里图标库Iconfont生成图标的三种使用方式(fontclass/unicode/symbol)
  11. python 标准库 -- requests
  12. 用tig来查看git log
  13. struts2和spring mvc的区别
  14. C# 6.0:Exception Filter——带条件的异常处理
  15. 30个mysql千万级大数据SQL查询优化技巧详解
  16. 《Inside C#》笔记(五) 方法
  17. 注意Sqlserver中使用with(nolock)后实际上还是会加架构锁,只是不对要查询的数据加S锁而已(转载)
  18. Qt在线/离线安装包下载网址和说明
  19. Linux下分割、合并文件——dd和cat
  20. 同时发出 ajax 拿到正确的返回值问题

热门文章

  1. [SpringBoot——Web开发(使用Thymeleaf模板引擎)]
  2. 阿里云CentOS7.3服务器通过Docker安装Nginx
  3. Nginx 配置Https转发http、 websocket
  4. [LeetCode]singleNumber
  5. Mysql学习笔记整理之选用B+tree结构
  6. Java查找统计文中字母,单词
  7. 浅谈Spring的事务隔离级别与传播性
  8. Springboot2.1.x配置Activiti7单独数据源问题
  9. thymeleaf 设置display样式
  10. pyinstaller程序打包工具