题目描述

随着改革开放的深入推进…… 小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. HTML学习1-Dom之事件绑定

    事件: 1.注册事件 a. <div onxxxx=””></div> b. document  .onxxxx= function()  //找到这个标签 2.this,触发 ...

  2. 04-matplotlib-柱形图

    import numpy as np import matplotlib.pyplot as plt # 柱形图 # 例一 N =5 y = [15,28,10,30,25] index = np.a ...

  3. [转载]GB2312简体中文编码表

    编码表源地址:http://www.knowsky.com/resource/gb2312tbl.htm编码在线查询:http://www.qqxiuzi.cn/bianma/zifuji.phpGB ...

  4. Excel VBA宏 链接服务器 上传和下载数据

    首先说明以下. 第一: 下面的 “ _" 也就是 空格下划线 在VBA中表示换行的意思:& 表示链接连个字符串的操作,注意 & 的前后是否需要空格 第二: 如果链接服务器,服 ...

  5. Linux基础入门--04

    目录结构及文件基本操作 实验介绍: 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录结构之 ...

  6. ### Error building SqlSession.

    org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession.### The error may e ...

  7. 2018软工实践—Beta冲刺(2)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Beta 冲鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调组内工作 修改前端界面 展示GitHub当日代码/文档签入记录(组内 ...

  8. 作业45//Calculator::3.0

    计算器 github 我的天我到底要写什么 一,2.0及2.6的改动 做了计算部分 加入了判断输入是否合法 合法的定义是算式符合`数字+运算符+数字+运算符+数字`的格式 其中`"-&quo ...

  9. “吃神么,买神么”的第一个Sprint计划(第三天)

    “吃神么,买神么”项目Sprint计划 ——5.23  星期六(第三天)立会内容与进度 摘要:今天的立会主要是报告进度以及遇到的困难. 进度:logo正在进行中,其他基本没什么问题.都确定要做出来的大 ...

  10. Socket 记录

    心跳检测步骤:1客户端每隔一个时间间隔发生一个探测包给服务器2客户端发包时启动一个超时定时器3服务器端接收到检测包,应该回应一个包4如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器5如果 ...