bzoj2564集合的面积
题目描述
对于两个点集A和B,定义集合的和为:
A+B={(xiA+xjB,yiA+yjB ):(xiA,yiA )∈A,(xjB,yjB )∈B}
现在给定一个N个点的集合A和一个M个点的集合B,求2F(A+B)。
输入格式
第一行包含用空格隔开的两个整数,分别为N和M;
第二行包含N个不同的数对,表示A集合中的N个点的坐标;
第三行包含M个不同的数对,表示B集合中的M个点的坐标。
输出格式
一共输出一行一个整数,2F(A+B)。
数据规模和约定
对于30%的数据满足N ≤ 200,M ≤ 200;
对于100%的数据满足N ≤ 10^5,M ≤ 10^5,|xi|, |yi| ≤ 10^8。
题解:
- 如果一个点成为了和$A+B$的凸包,那么一定同时在$A$和$B$的凸包上;
- 设$A+B$看成把凸包$A$平移后放在凸包$B$上,发现在两个凸包上组合成新的凸包的点对是单调的;
- 类似$graham$维护两个指针;
- 不太好说,附图,但是建议自己$YY$:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=;
int n,m,cnt1,cnt2,Cnt;
char gc(){
static char*p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return (p1==p2)?EOF:*p1++;
}
int rd(){
int x=,f=; char c=gc();
while(c<''||c>''){if(c=='-')f=-;c=gc();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=gc();}
return x*f;
}
struct poi{
int x,y;
poi(int _x=,int _y=):x(_x),y(_y){};
poi operator +(const poi&A)const{return poi(x+A.x,y+A.y);}
poi operator -(const poi&A)const{return poi(x-A.x,y-A.y);}
bool operator <(const poi&A)const{return x==A.x?y<A.y:x<A.x;}
}p1[N],p2[N],q1[N],q2[N],Q[N];
ll crs(poi A,poi B){return (ll)A.x*B.y-(ll)A.y*B.x;}
void convex(poi *p,poi *q,int&tot,int&cnt){
if(tot==){q[cnt=]=q[]=p[];return;}
sort(p+,p+tot+);
q[cnt=]=p[];
for(int i=;i<=tot;i++){
while(cnt> && crs(q[cnt]-q[cnt-],p[i]-q[cnt])<=)cnt--;
q[++cnt]=p[i];
}
int now=cnt;
for(int i=tot-;i;i--){
while(cnt>now && crs(q[cnt]-q[cnt-],p[i]-q[cnt])<=)cnt--;
q[++cnt]=p[i];
}
cnt--;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("bzoj2564.in","r",stdin);
freopen("bzoj2564.out","w",stdout);
#endif
n=rd();m=rd();
for(int i=;i<=n;i++)p1[i].x=rd(),p1[i].y=rd();
for(int i=;i<=m;i++)p2[i].x=rd(),p2[i].y=rd();
convex(p1,q1,n,cnt1);
convex(p2,q2,m,cnt2);
int i,j;
for(i=,j=;i<=cnt1;i++){
Q[++Cnt]=q1[i]+q2[j];
while(j<=cnt2&&crs(q2[j+]-q2[j],q1[i+]-q1[i])>){
Q[++Cnt]=q1[i]+q2[++j];
}
}
for(;j<=cnt2+;j++)Q[++Cnt]=q1[i]+q2[j];
Cnt--;
ll ans=;
for(i=;i<Cnt;i++)ans += crs(Q[i]-Q[],Q[i+]-Q[]);
printf("%lld\n",ans);
return ;
}bzoj2564
bzoj2564集合的面积的更多相关文章
- bzoj2564 集合的面积
Description 对于一个平面上点的集合P={(xi,yi )},定义集合P的面积F(P)为点集P的凸包的面积. 对于两个点集A和B,定义集合的和为: A+B={(xiA+xjB,yiA+yjB ...
- bzoj2564: 集合的面积(闵可夫斯基和 凸包)
题面 传送门 题解 花了一个下午的时间调出了一个稍微能看的板子--没办法网上的板子和咱的不太兼容-- 首先有一个叫做闵可夫斯基和的东西,就是给你两个点集\(A,B\),要你求一个点集\(C=\{x+y ...
- BZOJ2564: 集合的面积(闵可夫斯基和 凸包)
题意 题目链接 Sol 这个东西的学名应该叫"闵可夫斯基和".就是合并两个凸包 首先我们先分别求出给出的两个多边形的凸包.合并的时候直接拿个双指针扫一下,每次选最凸的点就行了. 复 ...
- bzoj 2564 集合的面积
Description 对于一个平面上点的集合P={(xi,yi )},定义集合P的面积F(P)为点集P的凸包的面积. 对于两个点集A和B,定义集合的和为: A+B={(xiA+xjB,yiA+yjB ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- UVALive 4794 Sharing Chocolate
Sharing Chocolate Chocolate in its many forms is enjoyed by millions of people around the world ever ...
- [opencv]二维码识别开发流程及问题复盘总结
项目复盘总结 开发需求: 在桌面机器人(向下俯视)摄像头拍摄到的图像中做条形码识别与二维码识别. 条形码在图像固定位置,二维码做成卡片的形式在固定区域内随意摆放. 开发环境及相关库:ubuntu 18 ...
- 计算照片的面积(WPF篇)
昨天,老周突发其想地给大伙伴们说了一下UWP应用中计算照片面积的玩法,而且老周也表示会提供WPF版本的示例.所以,今天就给大伙们补上吧. WPF是集成在.net框架中,属于.net的一部分,千万不要跟 ...
- 计算照片的面积(UWP篇)
今天先说UWP应用程序上计算照片面积的方法,改天有空,再说说WPF篇. 其实计算照片面积的原理真TMD简单,只要你有本事读到照片的像素高度和宽度,以及水平/垂直方向上的分辨率(DPI)就可以了.计算方 ...
随机推荐
- eclipse创建spring boot项目加载不到application.properties配置文件
在配置文件application.properties中修改了端口号,但重启服务后发现端口号并没有跟着改变,发现是项目启动时没有加载application.properties文件导致 解决:项目-& ...
- VMware启动Centos时出现错误Cannot open the disk 'xxxxxxx.vmdk' or one of the snapshot disks it depends on. .
今天拔装虚拟机的硬盘的时候,没有关掉虚拟机,导致虚拟打开的时候出现:Cannot open the disk 'xxxxxxx.vmdk' or one of the snapshot disks i ...
- 局域网arpspoof欺骗获取cookie/图片/密码
开启路由转发功能 查看IP转发功能是否打开 默认是不开起,0,我这里是修改后的,显示1. 修改转发功能,1为允许. 修改成功后再进行Arpspoof欺骗 如果开始劫持后,自己电脑无法联网了 ??? 检 ...
- 使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)
1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip ...
- 《Spring2之站立会议4》
<Spring2之站立会议4> 昨天,对主界面进行了设计,编写了主界面的代码,把文本输入框,显示框,发送,关闭两个按钮的功能实现了: 今天,接着对主界面进行代码的编写,实现了界面的美化,从 ...
- BufferedWriter与BufferedRead --------------------------Test2
package com.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; ...
- Math 类的使用(一小部分)
package com.Date.Math; /* Math 数学类, 主要是提供了很多的数学公式. abs(double a) 获取绝对值 ceil(double a) 向上取整 floor(dou ...
- 人and绩效and职业道德
人行走在这个世界上 避免不了的是各种悲哀 人就像是一个茶几 上面放满了各种杯具 而要做的是要么把杯具打碎了咽下去,要么被杯具打晕 本布衣 躬耕于南阳 不求闻达于诸侯 每个人都可以选择自己的生活方式 或 ...
- 我是一名IT小小鸟
我是一只it小小鸟 书中介绍了it界大牛们大学期间的学习方法和对未来的职业规划,相比他们,自我感觉相距甚远,对这学科的热情程度也远远比不上他们. 就拿目前数据结构这门高深的课程,应通过更多的课外扩展来 ...
- P4安装
P4安装篇 ubuntu 14.04为例子 一.首先要fork到自己的github里面 源码目录 https://github.com/p4lang/p4factory 然后fork到自己的githu ...