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 ...
随机推荐
- 安装配置heapster(包含influxdb,grafana)
前提:已搭建好kubernetes集群.安装完dashboard 默认安装的dashboard无法展示集群的度量指标信息,此时就需要安装heapster插件 Heapster 插件使用包含三部分内容: ...
- 第五章 if语句
5.2条件测试 使用==判断相当: 使用!=判断不相等: 每条if语句的核心都是一个值为Tre或False的表达式,这种表达式被称为条件测试,如果条件测试的值为Ture,则执行紧跟在if语句后面的代码 ...
- 11.16 Daily Scrum
由于今天是工作小周期的最后一天,今天的主要任务是解决了一周留下的技术方面的难题.一些类似于悬浮窗和进度条的bug修复全部在今天得到了解决,修复了数据库的内存泄露bug,软件的搜索功能的完善也接近尾声. ...
- Linux第一二章笔记
第一章 Linux内核简介 1. Unix内核的特点 简洁:仅提供系统调用并有一个非常明确的设计目的 抽象:几乎所有东西都被当做文件 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊 ...
- java BufferedWriter写数据不完全
package com.brucekun.keyword; import java.io.BufferedReader; import java.io.BufferedWriter; import j ...
- TCP/IP,HTTP,HTTPS,WEBSocket协议
我看看着挺多的,我暂时没时间自己写,有需要的请借鉴 http://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247486927&id ...
- 浅谈GIT
浅谈GIT: 牛老师提出的git,于我而言,是一个陌生和新鲜的词汇,在此之前我从未听过git,按照老师的要求,我去搜索了关于git的介绍,有些看懂了,但大部分还是不懂得,在介绍中我了解git其实之前使 ...
- frist Django app — 一、 创建工程(转载)
转载地址:https://www.cnblogs.com/sunshine-2015/p/5658283.html 缘起 既然python都学了,学习python的时候感觉是相见恨晚,一种新的编程语言 ...
- 微服务注册与发现 —— eureka
基础概念 在微服务系统中,服务的注册和发现是第一步,常用的有: Eureka:https://github.com/Netflix/eureka Zookeeper:https://zookeeper ...
- 关于VS2005中C#代码用F12转到定义时,总是显示从元数据的问题
元数据是:NET 程序集中的标记信息. 是在代码中选择了转到定义时候给定位的吧.因为没有找到源代码,VS通过反射读取元数据中的信息生成了那个. 解决方法: 1. 要把项目先添加到解决方案中. 2. 再 ...