「CF85E」 Guard Towers
「CF85E」 Guard Towers
模拟赛考了这题的加强版
然后我因为初值问题直接炸飞
题目大意:
给你二维平面上的 \(n\) 个整点,你需要将它们平均分成两组,使得每组内任意两点间的曼哈顿距离的最大值最小。
本题数据范围为 $n\le 5\times 10^3 $。
这种极值问题,很容易想到的是二分答案,而本题也确实可行。
二分距离的最大值 \(x\),将两点距离大于 \(x\) 的点对连边,则问题转化为我们构建的新图是否为二分图。
其实我感觉复杂度挺假的
考虑曼哈顿距离在此处处理并不方便,所以我们可以将其转化为切比雪夫距离进行求解。
(定义可以去网上康康)
即令 \((x,y)=(x+y,x-y)\),得到的新的点之间的切比雪夫距离等价于原来的点之间的曼哈顿距离。
曼哈顿距离:\(|x_1-x_2|+|y_1-y_2|\)
切比雪夫距离:\(\max\{|x_1-x_2|,|y_1-y_2|\}\)。
于是现在的问题变为:在平面内用两个相同大小的正方形覆盖所有点的最小正方形大小。
首先,平面上的所有点可以被一个最小的矩形覆盖,那么根据切比雪夫距离的定义,两个正方形的某一个顶点必定与矩形的某个顶点重合,因为这个矩形的每条边上都有点的存在。
也就是说,我们找到的两个正方形一定长这样:

如图所示共有两种情况需要讨论。
那么问题就非常简单了:我们枚举每个点,比较重合端点与该点的距离,以决定该点的归属。
这样我们可以在线性时间内找到两种情况的答案,比较即可。
这样我们解决了第一问,即每个正方形的大小。
如何统计方案数?
首先用两种颜色染色就有两种染色方案。
然后最后我们找到的正方形可能长这样:

红色部分的点可以被任意分配,每个点有两种情况,假设共有 \(x\) 个点,就有 \(2^x\) 种分配方案。
现在仍然有一个棘手的问题,如果刚才的两种情况得到的答案大小相等怎么办?
将最终答案乘二即可。
但是,仍然存在特殊情况。

当得到的正方形是这个样子的时候,我们上面讨论的两种情况是一样的,这个时候答案不需要发生改变。
综上,我们在 \(O(n)\) 的时间复杂度内解决了此问题。
(代码是考场上写的改的,真的很丑)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int p=1e9+7;
int x[maxn],y[maxn];
int X1=36456,X2=-4746,y3=34563,y4=-2345234;//看这个地方就知道我的心情有多复杂...
int dist(int X1,int Y1,int X2,int Y2){
return max(abs(X1-X2),abs(Y1-Y2));
}
int Ans=-1,Cnt,n,mx,cnt;
int ksm(int a,int b,int p){
int ans=1;
while(b){
if(b&1) ans=1ll*ans*a%p;
b>>=1,a=1ll*a*a%p;
}
return ans;
}
void calc(){
mx=0,cnt=0;
for(int i=1;i<=n;++i){
mx=max(mx,min(dist(x[i],y[i],X1,y3),dist(x[i],y[i],X2,y4)));
}
for(int i=1;i<=n;++i){
if(dist(x[i],y[i],X1,y3)<=mx&&dist(x[i],y[i],X2,y4)<=mx) ++cnt;
}
if(Ans==-1) Ans=mx,Cnt=cnt;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
if(n==2) cout<<"0\n2\n",exit(0);
for(int i=1;i<=n;++i){
int a,b;cin>>a>>b;
x[i]=a+b;
y[i]=a-b;
}
for(int i=1;i<=n;++i){
if(x[i]<X1) X1=x[i];
if(x[i]>X2) X2=x[i];
if(y[i]<y3) y3=y[i];
if(y[i]>y4) y4=y[i];
}
calc();
swap(y3,y4);
calc();
swap(y3,y4);
if(mx<Ans){
cout<<mx<<'\n'<<ksm(2,1+cnt,p)<<'\n';
}
else if(mx==Ans){
cnt=0;
for(int i=1;i<=n;++i){
if(dist(x[i],y[i],X1,y3)<=mx&&dist(x[i],y[i],X2,y4)<=mx) ++cnt;
else if(dist(x[i],y[i],X1,y4)<=mx&&dist(x[i],y[i],X2,y3)<=mx) ++cnt;
}
if(X2-X1>mx&&y4-y3>mx) cout<<mx<<'\n'<<ksm(2,2+cnt,p)<<'\n';
else cout<<mx<<'\n'<<ksm(2,1+cnt,p)<<'\n';
}
else cout<<Ans<<'\n'<<ksm(2,1+Cnt,p)<<'\n';
return 0;
}
「CF85E」 Guard Towers的更多相关文章
- [CF85E] Guard Towers - 二分+二分图
题目描述 In a far away kingdom lives a very greedy king. To defend his land, he built n n n guard towers ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
随机推荐
- 使用现代C++如何避免bugs(下)
使用现代C++如何避免bugs(下) About virtual functions Virtual functions hinder a potential problem: the thing ...
- python接口自动化之读取excel表的数据(使用openpyxl模块)
1.安装openpyxl:pip install openpyxl 2.基础知识,直接上代码 import openpyxl #导入模块 wd2=openpyxl.load_workbook('stu ...
- Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...
- 题解-P3810
P3810 [模板]三维偏序(陌上花开) 更好的阅读体验1 更好的阅读体验2 前置算法 树状数组求逆序对 归并排序求逆序对 解题之前,让我们来看一看弱化版本 \(\to\) 二维偏序 题意 给定两个长 ...
- 1482. 制作 m 束花所需的最少天数
2021-05-09 LeetCode每日一题 链接:https://leetcode-cn.com/problems/minimum-number-of-days-to-make-m-bouquet ...
- 性能工具之Jmeter小白入门系列之一
一.简单了解 Apache JMeter The Apache JMeter application is open source software, a 100% pure Java applica ...
- 【NX二次开发】获得屏幕矩阵并设置WCS为屏幕方向
说明:获得屏幕矩阵并设置WCS为屏幕方向(Z朝向自己,X轴朝右,Y轴超上). 方法: 1 extern DllExport void ufusr(char *param, int *retcode, ...
- sql:group by和 max
通过group by,having,max实现查询出每组里指定列中最大的内容 例如:我需要实现的功能是 获取每个模块中点击量最大的内容(表中有许多内容,内容里) 我写的查询语句如下 查询结果如下: 然 ...
- 【题解】 hdu2955 Robberies
有抱负的罗伊·劫匪已经看过很多美国电影,他知道坏人通常会被抓住,经常是因为他们太贪心了.他决定在银行抢劫案中工作一段时间,然后退休后到一所大学从事一份舒适的工作. 题目: 罗伊去几个银行偷盗,他既想多 ...
- GitHub Desktop的使用,创建项目、上传文件,设置忽略文件
下载登陆之后 新建项目File--第一个New repository 然后输入项目名称,选择项目文件夹,最后点Creata repository创建项目 这只是在本地建了项目. 项目文件夹中有其他文件 ...