题目描述

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


输入格式

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


输出格式

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


【数据范围】
对于100%的数据4≤n≤100000,坐标的绝对值不超过109 。

  • 题解

    • 可能和凸包没有什么关系吧。。。。。
    • 周长显然,直接将所有框起来即可,$2 * (max \{ x_{i} \}  -  min\{ x_{i} \} \ \  + \ \  max \{ y_{i} \}  -  min\{ y_{i} \}) $
    • 将所有都框起来并不是面积最小,因为有些部分收进去周长不会边长,但是面积会减小;
    • 但是也不能全部收进去因为会有类似于“凹”字的形状收进去后周长会变大;
    • 考虑每次从上到下扫描,维护当前横坐标的最大值和最小值,如果更新了最大值或最小值就新建一个拐点和新点;
    • 再从下面来一次,直接得到了点数O(2*n)的框,求面积即可;
 #include<bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
using namespace std;
const int N = ;
int n,c1,c2,c3,c4;
struct P{
int x,y;
P(int X=,int Y=):x(X),y(Y){};
bool operator <(const P&a)const{return x<a.x;}
}p[N],p1[N],p2[N],p3[N],p4[N];
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*+c-'',c=gc();
return x*f;
}
ll crs(const P&a,const P&b){return (ll)a.x*b.y-(ll)a.y*b.x;}
int main(){
#ifndef ONLINE_JUDGE
freopen("bzoj2146.in","r",stdin);
freopen("bzoj2146.out","w",stdout);
#endif
n=rd();
for(int i=;i<=n;++i)p[i].x=rd(),p[i].y=rd();
sort(p+,p+n+);
for(int i=,j=,mn=inf,mx=-inf;i<=n;i=j){
int mn1=inf,mx1=-inf;
for(;j<=n&&p[j].x==p[i].x;j++){
mn1=min(mn1,p[j].y);
mx1=max(mx1,p[j].y);
}
if(mn1<mn){
if(mn!=inf)p1[++c1]=P(p[i].x,mn);
p1[++c1]=P(p[i].x,mn=mn1);
}
if(mx1>mx){
if(mx!=-inf)p2[++c2]=P(p[i].x,mx);
p2[++c2]=P(p[i].x,mx=mx1);
}
} for(int i=n,j=n,mn=inf,mx=-inf;i;i=j){
int mn1=inf,mx1=-inf;
for(;j&&p[j].x==p[i].x;j--){
mn1=min(mn1,p[j].y);
mx1=max(mx1,p[j].y);
}
if(mn1<mn){
if(mn!=inf)p3[++c3]=P(p[i].x,mn);
p3[++c3]=P(p[i].x,mn=mn1);
}
if(mx1>mx){
if(mx!=-inf)p4[++c4]=P(p[i].x,mx);
p4[++c4]=P(p[i].x,mx=mx1);
}
}
P lst = p2[];
ll ans1=,ans2=;
for(int i=;i<=c1;++i){
ans1+=abs(p1[i].x-lst.x)+abs(p1[i].y-lst.y);
ans2+=crs(lst,p1[i]);
lst=p1[i];
}
for(int i=c3;i;--i){
ans1+=abs(p3[i].x-lst.x)+abs(p3[i].y-lst.y);
ans2+=crs(lst,p3[i]);
lst=p3[i];
}
for(int i=;i<=c4;++i){
ans1+=abs(p4[i].x-lst.x)+abs(p4[i].y-lst.y);
ans2+=crs(lst,p4[i]);
lst=p4[i];
}
for(int i=c2;i;--i){
ans1+=abs(p2[i].x-lst.x)+abs(p2[i].y-lst.y);
ans2+=crs(lst,p2[i]);
lst=p2[i];
}
printf("%lld\n%lld\n",ans1,ans2>>);
return ;
}

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. Hyperledger Fabric CA User’s Guide——配置设置(四)

    配置设置 Fabric CA提供了三种方案去配置Fabric CA服务端和客户端,优先顺序是: CLI flags(标识) 环境变量 配置文件 在本文档的其余部分中,我们将对配置文件进行更改.但是,可 ...

  2. Cocos2dx源码赏析(3)之事件分发

    Cocos2dx源码赏析(3)之事件分发 这篇,继续从源码的角度赏析下Cocos2dx引擎的另一模块事件分发处理机制.引擎的版本是3.14.同时,也是学习总结的过程,希望通过这种方式来加深对Cocos ...

  3. Java时间格式的使用,bug难时真是坑

    很简单的问题,尤其是新手开发,要多自己动手写代码,都说程序猿大都是程序的搬用工,其实不然,好的写手,和差的写手,区别就在是不是会花时间读读代码,并且自己动手实践一下,其实一个程序范这样的错误,绝对是低 ...

  4. nginx之location(root/alias)

    location配置 1. 语法规则(按优先级) =        表示精确匹配,优先级最高 ^~      表示uri以某个常规字符串开头,用于匹配url路径(而且不对url做编码处理,例如请求/s ...

  5. Python之并发编程-concurrent

    方法介绍 #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor: 进程池 ...

  6. android学习-2 (AVD 创建)

    在Android studio的tools下选择AVD manager 按照指示选择相应的硬件和系统映像. 在模拟器中运行应用 选择RUN APP 选择RUN时,并不只运行应用,还会处理运行应用所需要 ...

  7. Alpha 冲刺报告3

    队名 massivehard 组员一(组长:晓辉) 今天完成了哪些任务 .整理昨天的两个功能,补些bug 写了一个初步的loyaut github 还剩哪些任务: 后台的用来处理自然语言的服务器还没架 ...

  8. *** error 65: access violation at C:0x001B : no 'execute/read' permission

    转自:http://blog.csdn.net/chenqiai0/article/details/7827071 很多人在进行串口调试的时候会遇到这个问题,请大家略看我的代码,解决方法在其中 //实 ...

  9. OSG学习:裁剪变换(1)

    在OSG中,默认了6个裁剪平面以去除没有必要显示的物体.也可以自己定义其他的裁剪平面来确定裁剪. osg::ClipPlane类继承自osg::StateAttribute类,封装了OpenGL中的g ...

  10. 项目复审—Alpha阶段

    项目复审-Alpha阶段 小组的名字和链接 优 点 缺 点 排名 [别看了你没救队]http://www.cnblogs.com/liaoyujun233/p/9016362.html 此队优点很多, ...