bzoj2146 Construct
题目描述
随着改革开放的深入推进…… 小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的更多相关文章
- 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 ...
- [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 ...
- [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 ...
- 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 ...
- 【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 ...
- 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 ...
- Construct Binary Tree from Inorder and Postorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...
- Construct Binary Tree from Preorder and Inorder Traversal
Construct Binary Tree from Preorder and Inorder Traversal Given preorder and inorder traversal of a ...
- Reorder array to construct the minimum number
Construct minimum number by reordering a given non-negative integer array. Arrange them such that th ...
随机推荐
- Cocos2dx源码赏析(3)之事件分发
Cocos2dx源码赏析(3)之事件分发 这篇,继续从源码的角度赏析下Cocos2dx引擎的另一模块事件分发处理机制.引擎的版本是3.14.同时,也是学习总结的过程,希望通过这种方式来加深对Cocos ...
- paste命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/u011341352/article/details/52806312 个人分类: linux paste命令和cut命 ...
- Java 的 java_home, path, classpath
java_home: 指定 jdk 的安装目录. 第三方软件 Eclipse / Tomcat 在 java_home 指定的目录下查找安装好的 jdk. path: 配置 jdk 的安装目录.在命令 ...
- 常用DB2命令
建库 db2 territory CN on 建库到指定位置 db2 create database OADB on D: using codeset GBK territory CN 列出所有数据库 ...
- OO第一阶段作业总结
对于OO这门课,学长学姐偶尔提起,大家都略有耳闻,但是并没有将其和计组相提并论.因此,在刚开始接触的时候,并不认为其会比计组难到哪里去,然而事实证明,还是不要想当然去判断,以及不提前学好JAVA对于O ...
- 奔跑吧DKY——团队Scrum冲刺阶段-Day 2
今日完成任务 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如果完成的任务为调研任务,需给出对应的调研总结博客链接:如果完成的任务为学习技术任务,需 ...
- 20172322 实验一《Java开发环境的熟悉》实验报告
172322 2017-2018-2 <程序设计与数据结构>实验一报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 张昊然 学号:20172322 实验教师:王志强 ...
- 关于react虚拟DOM的研究
1.传统的前端是这样的,我在学校也都是这样做的,html(jsp)主要负责提供所有的DOM节点,而javascript负责动态效果,比如按钮点击,图片轮播等,这样的话javascript如何组织结构是 ...
- 索引超出了数组界限。 在 System.Collections.Generic.Dictionary`2.Resize
博问:Dictionary 超出了数组界限 异常: Exception type: IndexOutOfRangeException Exception message: 索引超出了数组界限. 在 S ...
- sqlserver结束和监视耗时的sql
在对象资源管理器中右击服务器地址选择“活动和监视器”. 点击最近耗费大量资源的查询