bzoj2564集合的面积

题目描述

  对于一个平面上点的集合P={(xi,yi )},定义集合P的面积F(P)为点集P的凸包的面积。
  对于两个点集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$:
    •  1 #include<bits/stdc++.h>
       2 #define ll long long
       3 using namespace std;
       4 const int N=200010;
       5 int n,m,cnt1,cnt2,Cnt;
       6 char gc(){
       7     static char*p1,*p2,s[1000000];
       8     if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
       9     return (p1==p2)?EOF:*p1++;
      10 }
      11 int rd(){
      12     int x=0,f=1; char c=gc();
      13     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=gc();}
      14     while(c>=‘0‘&&c<=‘9‘){x=(x<<1)+(x<<3)+c-‘0‘;c=gc();}
      15     return x*f;
      16 }
      17 struct poi{
      18     int x,y;
      19     poi(int _x=0,int _y=0):x(_x),y(_y){};
      20     poi operator +(const poi&A)const{return poi(x+A.x,y+A.y);}
      21     poi operator -(const poi&A)const{return poi(x-A.x,y-A.y);}
      22     bool operator <(const poi&A)const{return x==A.x?y<A.y:x<A.x;}
      23 }p1[N],p2[N],q1[N],q2[N],Q[N];
      24 ll crs(poi A,poi B){return (ll)A.x*B.y-(ll)A.y*B.x;}
      25 void convex(poi *p,poi *q,int&tot,int&cnt){
      26     if(tot==1){q[cnt=1]=q[2]=p[1];return;}
      27     sort(p+1,p+tot+1);
      28     q[cnt=1]=p[1];
      29     for(int i=2;i<=tot;i++){
      30         while(cnt>1 && crs(q[cnt]-q[cnt-1],p[i]-q[cnt])<=0)cnt--;
      31         q[++cnt]=p[i];
      32     }
      33     int now=cnt;
      34     for(int i=tot-1;i;i--){
      35         while(cnt>now && crs(q[cnt]-q[cnt-1],p[i]-q[cnt])<=0)cnt--;
      36         q[++cnt]=p[i];
      37     }
      38     cnt--;
      39 }
      40 int main(){
      41     #ifndef ONLINE_JUDGE
      42     freopen("bzoj2564.in","r",stdin);
      43     freopen("bzoj2564.out","w",stdout);
      44     #endif
      45     n=rd();m=rd();
      46     for(int i=1;i<=n;i++)p1[i].x=rd(),p1[i].y=rd();
      47     for(int i=1;i<=m;i++)p2[i].x=rd(),p2[i].y=rd();
      48     convex(p1,q1,n,cnt1);
      49     convex(p2,q2,m,cnt2);
      50     int i,j;
      51     for(i=1,j=1;i<=cnt1;i++){
      52         Q[++Cnt]=q1[i]+q2[j];
      53         while(j<=cnt2&&crs(q2[j+1]-q2[j],q1[i+1]-q1[i])>0){
      54             Q[++Cnt]=q1[i]+q2[++j];
      55         }
      56     }
      57     for(;j<=cnt2+1;j++)Q[++Cnt]=q1[i]+q2[j];
      58     Cnt--;
      59     ll ans=0;
      60     for(i=2;i<Cnt;i++)ans += crs(Q[i]-Q[1],Q[i+1]-Q[1]);
      61     printf("%lld\n",ans);
      62     return 0;
      63 }

      bzoj2564

原文地址:https://www.cnblogs.com/Paul-Guderian/p/10269970.html

时间: 2024-10-09 12:15:42

bzoj2564集合的面积的相关文章

算法实现柱形集合积水面积

用一个数组代表柱形墙的的高度.当下雨的时候柱形墙能积水的体积是多少 下面是python的实现算法: # -*- coding: utf-8 -*- def savewater(arr): point_l=0 max_l=arr[0] point_r=len(arr)-1 max_r=arr[len(arr)-1] volume=0 #point_l从左向右遍历,point_r从右向左遍历 while point_l<point_r: #能积水的标准时两边的高度大于中间的 if max_l<ma

概率论02 概率公理-集合

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 概率论早期用于研究赌博中的概率事件.赌徒对于结果的判断基于直觉,但高明的赌徒尝试从理性的角度来理解.然而,赌博中的一些结果似乎有矛盾.比如掷一个骰子,每个数字出现的概率相等,都是1/6.然而,如果有两个骰子,那么出现的2到12这些数字的概率却不相同.概率论这门学科正是为了搞清楚这些矛盾背后的原理. 早期的概率论是一门混合了经验的数学学科,并没有严格的用语.因此,概率论在数学的精密

首次启动优美新手指引tip

前言 系列文章:[传送门] 期末考试复习,就准备这系列的博客,记录 概率论 复习的成果. 正文 内容来自 概率论相关书籍 及 资料,有疑问请留言. 随机试验 · 样本空间 任何一个过程,如果它的结果是随机的(无法事前知道),那么该过程就称为一个随机试验(E).具有三个性质: (1)每次试验的可能结果不止一个,并且能事先明确试验的所有可能结果. (2)进行一次试验之前无法确定哪一个结果会出现. (3) 可以在同一条件下重复进行试验. 实验所有可能的结果组成一个集合(set),叫做样本空间(samp

动态规划&amp;&amp;状压

目录 一.动态规划 案例一.简单的一维 DP 二.状态压缩 UVA1099 一.动态规划 动态规划,无非就是利用历史记录,来避免我们的重复计算.而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存.下面我们先来讲下做动态规划题很重要的三个步骤, 如果你听不懂,也没关系,下面会有很多例题讲解,估计你就懂了.之所以不配合例题来讲这些步骤,也是为了怕你们脑袋乱了 第一步骤:定义数组元素的含义,上面说了,我们会用一个数组,来保存历史数组,假设用一维数组 dp[] 吧.这个时候有一

ansys 常见命令集合

APDL换行与续行- APDL规定每行72个字符 如果要写表达式A=C1+C2 (C1与C2都为表达式 可以用 B=C1 A=B+C2 将一行拆成两行来做但是如果不是表达式,而是输入一个命令参数过多的话,可以用续行命令RMORE,格式如下: RMORE, R7, R8, R9, R10, R11, R12 这个命令每次也只能输入6个参数,如果多于6个,可以重复使用RMORE就可以输入13-18,19-24等等.另外,于上面续行相应的是换行,一行命令太短可以使用多个命令共一行 $",没有双引号.这

poj 1265 Area 面积+多边形内点数

Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5861   Accepted: 2612 Description Being well known for its highly innovative products, Merck would definitely be a good target for industrial espionage. To protect its brand-new resear

根据周长计算不同形状图形的面积?计算多种图形的面积

/** *  根据周长计算不同形状图形的面积?计算多种图形的面积, *  并比较各种图形面积的最大值.正方形的面积公式为:0.0625*c*c. *  圆形的面积公式为:0.0796*c*c,其中,c表示图形的周长. */ /** * 根据周长计算不同形状图形的面积?计算多种图形的面积, * 并比较各种图形面积的最大值.正方形的面积公式为:0.0625*c*c. * 圆形的面积公式为:0.0796*c*c,其中,c表示图形的周长. */ public class AreaTest { publi

计算照片的面积(UWP篇)

今天先说UWP应用程序上计算照片面积的方法,改天有空,再说说WPF篇. 其实计算照片面积的原理真TMD简单,只要你有本事读到照片的像素高度和宽度,以及水平/垂直方向上的分辨率(DPI)就可以了.计算方法也很容易,把像素值除以DPI,得到的是照片的宽度或高度,单位是英寸. 通常咱们计算面积是按平方米来算(不信你问问数码摄影店的伙计们),也可以按平方厘米来算.没关系,只要算出平方厘米,你就知道怎么转为平方米了.英寸和厘米的换算是: 1 inch = 2.54 cm 好,思想工作做完了,接下来就是开工

计算照片的面积(WPF篇)

昨天,老周突发其想地给大伙伴们说了一下UWP应用中计算照片面积的玩法,而且老周也表示会提供WPF版本的示例.所以,今天就给大伙们补上吧. WPF是集成在.net框架中,属于.net的一部分,千万不要跟我说你学.net不学WPF,那是不对的,包括ASP.NET.WCF.WF等都是.net框架的一部分,它们在本质上并没有脱离.net. 废话少扯,扯了也没人听,咱们说正题吧. WPF库中与UWP的不太一样,图像解码编码API似乎不像UWP中那么强大,大概是因为桌面程序可以调用Win32 API和COM