题目描述

随着改革开放的深入推进…… 小T家要拆迁了…… 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户。 由于小T的家位于市中心,拆迁工作又难以进行,有关部门决定先把小T家用围栏围起来,以免影响市容。考虑到要建设资源节约型社会,他们希望所用的围栏长度越短越好,由于市中心寸土寸金,在围栏长度最短的情况下,围出的多边形面积越小越好。 为了简化问题,我们约定,小T的家是一个多边形,并且每条边与坐标轴平行,围栏构成的也是多边形,每条边与坐标轴平行。


输入格式

在第一行列出整数n——多边形的顶点的数量。在以下n行中的每一行都有两个整数——沿逆时针方向走过这个多边形顺次所经过的顶点的坐标。边界的任意三个连续顶点不在一条直线上。多边形的边界不含自交和自切。


输出格式

输出两行,第一行为围栏最短的长度,第二行为长度最短的前提下,最小的面积。


  1. 【数据范围】
  2. 对于100%的数据4n100000,坐标的绝对值不超过109

  • 题解

    • 可能和凸包没有什么关系吧。。。。。
    • 周长显然,直接将所有框起来即可,$2 * (max \{ x_{i} \}  -  min\{ x_{i} \} \ \  + \ \  max \{ y_{i} \}  -  min\{ y_{i} \}) $
    • 将所有都框起来并不是面积最小,因为有些部分收进去周长不会边长,但是面积会减小;
    • 但是也不能全部收进去因为会有类似于“凹”字的形状收进去后周长会变大;
    • 考虑每次从上到下扫描,维护当前横坐标的最大值和最小值,如果更新了最大值或最小值就新建一个拐点和新点;
    • 再从下面来一次,直接得到了点数O(2*n)的框,求面积即可;
  1. #include<bits/stdc++.h>
  2. #define inf 0x7fffffff
  3. #define ll long long
  4. using namespace std;
  5. const int N = ;
  6. int n,c1,c2,c3,c4;
  7. struct P{
  8. int x,y;
  9. P(int X=,int Y=):x(X),y(Y){};
  10. bool operator <(const P&a)const{return x<a.x;}
  11. }p[N],p1[N],p2[N],p3[N],p4[N];
  12. char gc(){
  13. static char*P1,*P2,s[];
  14. if(P1==P2)P2=(P1=s)+fread(s,,,stdin);
  15. return(P1==P2)?EOF:*P1++;
  16. }
  17. int rd(){
  18. int x=,f=;char c=gc();
  19. while(c<''||c>''){if(c=='-')f=-;c=gc();}
  20. while(c>=''&&c<='')x=x*+c-'',c=gc();
  21. return x*f;
  22. }
  23. ll crs(const P&a,const P&b){return (ll)a.x*b.y-(ll)a.y*b.x;}
  24. int main(){
  25. #ifndef ONLINE_JUDGE
  26. freopen("bzoj2146.in","r",stdin);
  27. freopen("bzoj2146.out","w",stdout);
  28. #endif
  29. n=rd();
  30. for(int i=;i<=n;++i)p[i].x=rd(),p[i].y=rd();
  31. sort(p+,p+n+);
  32. for(int i=,j=,mn=inf,mx=-inf;i<=n;i=j){
  33. int mn1=inf,mx1=-inf;
  34. for(;j<=n&&p[j].x==p[i].x;j++){
  35. mn1=min(mn1,p[j].y);
  36. mx1=max(mx1,p[j].y);
  37. }
  38. if(mn1<mn){
  39. if(mn!=inf)p1[++c1]=P(p[i].x,mn);
  40. p1[++c1]=P(p[i].x,mn=mn1);
  41. }
  42. if(mx1>mx){
  43. if(mx!=-inf)p2[++c2]=P(p[i].x,mx);
  44. p2[++c2]=P(p[i].x,mx=mx1);
  45. }
  46. }
  47.  
  48. for(int i=n,j=n,mn=inf,mx=-inf;i;i=j){
  49. int mn1=inf,mx1=-inf;
  50. for(;j&&p[j].x==p[i].x;j--){
  51. mn1=min(mn1,p[j].y);
  52. mx1=max(mx1,p[j].y);
  53. }
  54. if(mn1<mn){
  55. if(mn!=inf)p3[++c3]=P(p[i].x,mn);
  56. p3[++c3]=P(p[i].x,mn=mn1);
  57. }
  58. if(mx1>mx){
  59. if(mx!=-inf)p4[++c4]=P(p[i].x,mx);
  60. p4[++c4]=P(p[i].x,mx=mx1);
  61. }
  62. }
  63. P lst = p2[];
  64. ll ans1=,ans2=;
  65. for(int i=;i<=c1;++i){
  66. ans1+=abs(p1[i].x-lst.x)+abs(p1[i].y-lst.y);
  67. ans2+=crs(lst,p1[i]);
  68. lst=p1[i];
  69. }
  70. for(int i=c3;i;--i){
  71. ans1+=abs(p3[i].x-lst.x)+abs(p3[i].y-lst.y);
  72. ans2+=crs(lst,p3[i]);
  73. lst=p3[i];
  74. }
  75. for(int i=;i<=c4;++i){
  76. ans1+=abs(p4[i].x-lst.x)+abs(p4[i].y-lst.y);
  77. ans2+=crs(lst,p4[i]);
  78. lst=p4[i];
  79. }
  80. for(int i=c2;i;--i){
  81. ans1+=abs(p2[i].x-lst.x)+abs(p2[i].y-lst.y);
  82. ans2+=crs(lst,p2[i]);
  83. lst=p2[i];
  84. }
  85. printf("%lld\n%lld\n",ans1,ans2>>);
  86. return ;
  87. }

bzoj2146

bzoj2146 Construct的更多相关文章

  1. Leetcode, construct binary tree from inorder and post order traversal

    Sept. 13, 2015 Spent more than a few hours to work on the leetcode problem, and my favorite blogs ab ...

  2. [LeetCode] Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树

    Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume tha ...

  3. [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  4. Leetcode Construct Binary Tree from Inorder and Postorder Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  5. 【LeetCode OJ】Construct Binary Tree from Preorder and Inorder Traversal

    Problem Link: https://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-trave ...

  6. LeetCode OJ 106. Construct Binary Tree from Inorder and Postorder Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  7. Construct Binary Tree from Inorder and Postorder Traversal

    Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...

  8. Construct Binary Tree from Preorder and Inorder Traversal

    Construct Binary Tree from Preorder and Inorder Traversal Given preorder and inorder traversal of a ...

  9. Reorder array to construct the minimum number

    Construct minimum number by reordering a given non-negative integer array. Arrange them such that th ...

随机推荐

  1. 安装配置heapster(包含influxdb,grafana)

    前提:已搭建好kubernetes集群.安装完dashboard 默认安装的dashboard无法展示集群的度量指标信息,此时就需要安装heapster插件 Heapster 插件使用包含三部分内容: ...

  2. 第五章 if语句

    5.2条件测试 使用==判断相当: 使用!=判断不相等: 每条if语句的核心都是一个值为Tre或False的表达式,这种表达式被称为条件测试,如果条件测试的值为Ture,则执行紧跟在if语句后面的代码 ...

  3. 11.16 Daily Scrum

    由于今天是工作小周期的最后一天,今天的主要任务是解决了一周留下的技术方面的难题.一些类似于悬浮窗和进度条的bug修复全部在今天得到了解决,修复了数据库的内存泄露bug,软件的搜索功能的完善也接近尾声. ...

  4. Linux第一二章笔记

    第一章 Linux内核简介 1. Unix内核的特点 简洁:仅提供系统调用并有一个非常明确的设计目的 抽象:几乎所有东西都被当做文件 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊 ...

  5. java BufferedWriter写数据不完全

    package com.brucekun.keyword; import java.io.BufferedReader; import java.io.BufferedWriter; import j ...

  6. TCP/IP,HTTP,HTTPS,WEBSocket协议

    我看看着挺多的,我暂时没时间自己写,有需要的请借鉴 http://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247486927&id ...

  7. 浅谈GIT

    浅谈GIT: 牛老师提出的git,于我而言,是一个陌生和新鲜的词汇,在此之前我从未听过git,按照老师的要求,我去搜索了关于git的介绍,有些看懂了,但大部分还是不懂得,在介绍中我了解git其实之前使 ...

  8. frist Django app — 一、 创建工程(转载)

    转载地址:https://www.cnblogs.com/sunshine-2015/p/5658283.html 缘起 既然python都学了,学习python的时候感觉是相见恨晚,一种新的编程语言 ...

  9. 微服务注册与发现 —— eureka

    基础概念 在微服务系统中,服务的注册和发现是第一步,常用的有: Eureka:https://github.com/Netflix/eureka Zookeeper:https://zookeeper ...

  10. 关于VS2005中C#代码用F12转到定义时,总是显示从元数据的问题

    元数据是:NET 程序集中的标记信息. 是在代码中选择了转到定义时候给定位的吧.因为没有找到源代码,VS通过反射读取元数据中的信息生成了那个. 解决方法: 1. 要把项目先添加到解决方案中. 2. 再 ...