「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 语言,还是在刚进入大学的时候,算起来有好些 ...
随机推荐
- (转)修改python默认排序方式
在Java中,自定义类可以通过继承comparable接口,重写compareTo方法来使用内置sort()函数来对自定义对象排序,我就在想Python中有没有类似的操作. 首先随便写个自定义类,比如 ...
- 『动善时』JMeter基础 — 36、JMeter接口关联【正则表达式提取器】
目录 1.正则表达式提取器介绍 2.正则表达式提取器界面详解 3.正则表达式提取器的使用 (1)测试计划内包含的元件 (2)请求一界面内容 (3)正则表达式提取器界面内容 (4)请求二界面内容 (5) ...
- deeplearning模型库
deeplearning模型库 1. 图像分类 数据集:ImageNet1000类 1.1 量化 分类模型Lite时延(ms) 设备 模型类型 压缩策略 armv7 Thread 1 armv7 T ...
- 用NVIDIA-TensorRT构造深度神经网络
用NVIDIA-TensorRT构造深度神经网络 Deploying Deep Neural Networks with NVIDIA TensorRT NVIDIA TensorRT是一个用于生产环 ...
- 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练
在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...
- 如何安装/导入Arduino库文件及库文件的不同位置与区别(以eFLL中嵌入式模糊逻辑库为例)
网上有数百个可在Aruduino中使用的库,这些代码集使得我们无需从0-1地搭建我们所需功能,这使得学习和使用Arduino变得更加方便简单.除此之外,平时直接从网上download下的代码也很有可能 ...
- 137. 只出现一次的数字 II
2021-04-30 LeetCode每日一题 链接:https://leetcode-cn.com/problems/single-number-ii/ 方法1:使用map记录每个数出现的次数,再找 ...
- MySQL进阶:主主复制+Keepalived高可用
Blog:博客园 个人 概述 mysql主主复制 所谓主主复制,即双主备份,或者叫互作主从复制,每台master既是master,又是slave.这种方案,既做到了访问量的压力分流,同时也解决了单点故 ...
- 既然有 HTTP 请求,为什么还要用 RPC 调用?
首先,实名赞扬题主的问题.这个问题非常好. 其次,实名反对各个上来就讲RPC好而HTTP不好的答案.因为,题主的观点非常对. HTTP协议,以其中的Restful规范为代表,其优势很大.它可读性好,且 ...
- C# 设置Word文本框中的文字旋转方向
在Word中可插入文本框,默认情况下插入的文本框中的文字方向为横向排列,对于一些特殊文档的设计要求,需要改变文字方向,如本次测试中的文档排版为考生试卷类型,考生信息栏的内容为下图中的这种, 本文将以C ...