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 ...
随机推荐
- (二)Hyperledger Fabric 1.1安装部署-Fabric Samples
Hyperledger Fabric Samples是官方推荐的First Network,对于熟悉fabric和测试基础环境很有好处. Fabric Samples源码下载:使用git下载源码,进入 ...
- python3.6环境中django2.0与xadmin0.6结合的后台管理
1.xadmin简介 django的admin管理后台页面很简洁,对个人来说做后台管理非常简单:xadmin的比较admin优化界面,看着也舒服. xadmin界面效果如下: 2.xadmin安装 从 ...
- linux压缩相关
tar命令 tar是打包,即把好多东西放在一个大文件里面,之后再压缩:当然也可以解包 tar的几个参数说明: -c 创建一个新的包 -x 将包里的文件还原出来 -t 显示包内文件的列表 -f 指定要处 ...
- 亚马逊的客户服务和承诺 - Delay in shipping your Amazon.com order - Missed Fulfillment Promise
We encountered a delay in shipping your order. We apologize for the inconvenience. Since your packag ...
- Scrum立会报告+燃尽图(Final阶段第二次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2481 项目地址:https://coding.net/u/wuyy694 ...
- 个人作业-Week 1
1)快速看完整部教材,列出你仍然不懂的5到10个问题,发布在你的个人博客上. Q1:"Scrum Master不是一个官,而是一个没有行政权力的沟通者,就像微软的PM那样.他/她同时还要在团 ...
- 20162314 《Program Design & Data Structures》Learning Summary Of The Seventh Week
20162314 2017-2018-1 <Program Design & Data Structures>Learning Summary Of The Seventh Wee ...
- servlet 路径问题
首先明确绝对路径与相对路径,绝对路径:相对于盘符的路径c://a.txt,相对路径格式如/web/hello.jsp.还有一个是网络路径http://www.baidu.com/...... 一般来说 ...
- POJ 3744 Scout YYF I 概率dp+矩阵快速幂
题目链接: http://poj.org/problem?id=3744 Scout YYF I Time Limit: 1000MSMemory Limit: 65536K 问题描述 YYF is ...
- sql经常出现死锁解决办法
文章:sql server在高并发状态下同时执行查询与更新操作时的死锁问题