Description

给你N个点,请循环完成下列任务 1:求出这N个点的凸包的面积 2:拿掉最左或最右或最上或最下的一个点,当点的个数不足三个时停止

Input

第一行,一个数字N 接下来N行,每行两个数Xi,Yi 接下来,一个字符串,表示每次拿走的点(仅为UDLR代表上下左右)

Output

输出有N-2行,每行一个实数,保留一位小数

预处理删点顺序,逆序加点,用set和链表维护凸包上的点的极角序(以最初凸包内一点为原点),每次更新凸包时计算面积的变化量。

#include<bits/stdc++.h>
typedef long long i64;
int _(){
int x=,c=getchar();
while(c<)c=getchar();
while(c>)x=x*+c-,c=getchar();
return x;
}
int n;
double xs=,ys=;
struct _pos{
int id;
double a;
bool operator<(const _pos&w)const{return a<w.a;}
};
std::set<_pos>ss;
struct pos{
int x,y,id;
_pos get(){return(_pos){id,std::atan2(y-ys,x-xs)};}
}ps[],ps2[],ps0[];
bool cx(const pos&a,const pos&b){return a.x<b.x;}
bool cy(const pos&a,const pos&b){return a.y<b.y;}
char s[];
bool del[];
int ds[],dp=,nx[],pv[],cs[],ap=;
i64 ans=,as[];
bool chk(int a,int b,int c){
return i64(ps0[a].x-ps0[b].x)*(ps0[c].y-ps0[b].y)-i64(ps0[c].x-ps0[b].x)*(ps0[a].y-ps0[b].y)>=;
}
void cal(int a,int b,int c){
ans+=i64(ps0[c].x-ps0[b].x)*(ps0[a].y-ps0[b].y)-i64(ps0[a].x-ps0[b].x)*(ps0[c].y-ps0[b].y);
}
void dels(int w){
cal(nx[w],w,pv[w]);
nx[pv[w]]=nx[w];
pv[nx[w]]=pv[w];
ss.erase(ss.find(ps0[w].get()));
}
void inss(int l,int a,int r,_pos w){
cal(l,a,r);
nx[pv[a]=l]=pv[nx[a]=r]=a;
ss.insert(w);
}
int main(){
n=_();
for(int i=;i<n;++i){
ps[i].x=_();
ps[i].y=_();
ps[i].id=i;
}
memcpy(ps2,ps,sizeof(pos)*n);
memcpy(ps0,ps,sizeof(pos)*n);
std::sort(ps,ps+n,cx);
std::sort(ps2,ps2+n,cy);
int l1=,r1=n-,l2=,r2=n-;
scanf("%s",s);
for(int i=;s[i];++i){
if(s[i]=='L'){
while(del[ps[l1].id])++l1;
del[ds[dp++]=ps[l1++].id]=;
}else
if(s[i]=='R'){
while(del[ps[r1].id])--r1;
del[ds[dp++]=ps[r1--].id]=;
}else
if(s[i]=='D'){
while(del[ps2[l2].id])++l2;
del[ds[dp++]=ps2[l2++].id]=;
}else{
while(del[ps2[r2].id])--r2;
del[ds[dp++]=ps2[r2--].id]=;
}
}
int cp=;
for(int i=l1;i<=r1;++i)if(!del[ps[i].id]){
xs+=ps[i].x;
ys+=ps[i].y;
cs[cp++]=ps[i].id;
}
xs/=;ys/=;
ss.insert(ps0[cs[]].get());
ss.insert(ps0[cs[]].get());
pv[cs[]]=nx[cs[]]=cs[];
pv[cs[]]=nx[cs[]]=cs[];
while(dp){
int a=ds[--dp];
_pos w=ps0[a].get();
std::set<_pos>::iterator it=ss.lower_bound(w);
if(it==ss.end())it=ss.begin();
int r=it->id,l=pv[r];
if(!chk(l,a,r)){
while(chk(a,r,nx[r]))dels(r),r=nx[r];
while(chk(pv[l],l,a))dels(l),l=pv[l];
inss(l,a,r,w);
}
as[ap++]=ans;
}
while(ap){
ans=as[--ap];
printf("%lld.%lld\n",ans>>,*(ans&));
}
return ;
}

bzoj1837: [CROATIAN2009]cavli 凸包1的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. [poj1113][Wall] (水平序+graham算法 求凸包)

    Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...

  3. ZOJ 3871 Convex Hull(计算几何、凸包)

    题意:给n个点,|x[i]|,|y[i]| <= 1e9.求在所有情况下的子集下(子集点数>=3),凸包的面积和. 这题主要有几个方面,一个是凸包的面积,可以直接用线段的有向面积和求得,这 ...

  4. UVALive 2453 Wall (凸包)

    题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...

  5. UVA 11168 Airport(凸包+直线方程)

    题意:给你n[1,10000]个点,求出一条直线,让所有的点都在都在直线的一侧并且到直线的距离总和最小,输出最小平均值(最小值除以点数) 题解:根据题意可以知道任意角度画一条直线(所有点都在一边),然 ...

  6. 关于2016.12.12——T1的反思:凸包的意义与应用

    2016.12.12 T1 给n个圆,保证圆圆相离,求将圆围起来的最小周长.n<=100 就像上图.考场上,我就想用切线的角度来做凸包.以圆心x,y排序,像点凸包一样,不过用两圆之间的下切线角度 ...

  7. poj1228--稳定凸包

    题目大意:给你一个凸包上的某些点(可能在凸包内),询问是否能确定这个凸包. 思路:先求出题目给出的点的凸包,看看在凸包的每条边内(不包括端点)有没有点,若有,则这条边是确定的,若没有,则这条边不确定, ...

  8. POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心

    题意: 两个凸多面体,可以任意摆放,最多贴着,问他们重心的最短距离. 解法: 由于给出的是凸多面体,先构出两个三维凸包,再求其重心,求重心仿照求三角形重心的方式,然后再求两个多面体的重心到每个多面体的 ...

  9. HDU 4946 Area of Mushroom(构造凸包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...

随机推荐

  1. js时间格式转换的几种方法

    公司项目需要获取时间并且转换格式,之前没有实现过但读过源码,新来的小哥给我讲了下细节.算是学到了..... function getLocalTime(){ var now=new Date(); v ...

  2. python中lambda函数

    1.lambda函数使用如下: lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右侧的是返回值 >>> g=lambda x,y:x*y>>> g(4 ...

  3. Shell脚本的追踪与debug

    [xd502djj@linux ~]#sh [-nvx] scripts.sh 参数: -n:不执行脚本,仅仅查询语法错误 -v:执行脚本前,先将脚本scripts的内容输出到屏幕上 -x:将使用到的 ...

  4. 第一个Java web项目:员工管理系统

    要求: 做一个登陆页面,实现登录,用户名和密码都是admin,登录成功后,用session记录用户名,登录失败,请提示失败原因. 做一个简单的管理系统,实现注册,修改,查询,删除 员工的功能,注册内容 ...

  5. 2D 《触不可及》

    这是一个有着特殊意义的夜晚(2014.9.19),孙红雷的电影这场电影<触不可及>也有着不一般的涵义,于我,在万达商场,遂留此一笔,仅供回忆.

  6. Svn常见问题及相关原因

    1. svn: Server sent unexpected return value (500 Internal Server Error) in response to OPTIONS reque ...

  7. POJ 1094 Sorting It All Out 拓扑排序 难度:0

    http://poj.org/problem?id=1094 #include <cstdio> #include <cstring> #include <vector& ...

  8. SQLite存储类(数据类型)

    SQLite数据类型更普遍,采用动态类型系统. 说是数据类型,更像是存储类,如:INTEGER存储类就包含多种不同长度的整数数据类型 [INTEGER]带符号的整数类型 [REAL]浮点值,小数类型 ...

  9. python3+任务计划实现的人人影视网站自动签到

    python3+任务计划实现的人人影视网站自动签到 这是一个自动化程度较高的程序,运行本程序后会从chrome中读取cookies用于登录人人影视签到, 并且会自动添加一个windows 任务计划,这 ...

  10. Annotation注解(有源代码)

    注解(annotation)概述: ·从JDK5.0 开始,java增加了对元数据(MetaData)的支持,也就是Annotation(注解) ·Annotation其实就是代码里的特殊标记,这些标 ...