计算几何-BZOJ2618-凸包的交-HPI
This article is made by Jason-Cow.
Welcome to reprint.
But please post the article's address.
1A,看懂了题目就是读入的复杂度
把每个凸包看成m个约束条件
一起读入然后做一次HPI
O((nm)log(nm)) (nm<=500,时间完全可以承受)
- /**************************************************************
- Problem: 2618
- User: Jaosn_liu
- Language: C++
- Result: Accepted
- Time:0 ms
- Memory:1332 kb
- ****************************************************************/
ACcode
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <cstdlib>
- #include <cstdio>
- #include <vector>
- #include <cmath>
- #include <queue>
- #include <map>
- #include <set>
- using namespace std;
- #define sqr(x) ((x)*(x))
- #define RG register
- #define op operator
- #define IL inline
- typedef double db;
- typedef bool bl;
- const db pi=acos(-1.0),eps=1e-;
- struct D{
- db x,y;
- D(db x=0.0,db y=0.0):x(x),y(y){}
- };
- typedef D V;
- bl operator<(D A,D B){return A.x<B.x||(A.x==B.x&&A.y<B.y);}
- V operator+(V A,V B){return V(A.x+B.x,A.y+B.y);}
- V operator-(V A,V B){return V(A.x-B.x,A.y-B.y);}
- V operator*(V A,db N){return V(A.x*N,A.y*N);}
- V operator/(V A,db N){return V(A.x/N,A.y/N);}
- db Ang(db x){return(x*180.0/pi);}
- db Rad(db x){return(x*pi/180.0);}
- V Rotate(V A,db a){return V(A.x*cos(a)-A.y*sin(a),A.x*sin(a)+A.y*cos(a));}
- db Dis(D A,D B){return sqrt(sqr(A.x-B.x)+sqr(A.y-B.y));}
- db Cross(V A,V B){return A.x*B.y-A.y*B.x;}
- db Area(D*R,int n){
- db S=0.0;
- for(int i=;i<n;i++)S+=Cross(R[i]-R[],R[i+]-R[]);
- return S/;
- }
- db Length(D*R,int n){
- db C=0.0;
- for(int i=;i<=n;i++)C+=Dis(R[i],R[i-]);
- return C+Dis(R[n],R[]);
- }
- struct L{
- D P,v;
- db a;
- L(){}
- L(D P,V v):P(P),v(v){a=atan2(v.y,v.x);}
- bool operator<(const L x)const{return a<x.a;}
- };
- D Intersect(L a,L b){
- V u=a.P-b.P;
- return a.P+a.v*(Cross(b.v,u)/Cross(a.v,b.v));
- }
- bool Left(L l,D A){
- return Cross(l.v,A-l.P)>;
- }
- int HPI(L*l,int n,D*ans){
- int head,tail,m=;
- D*P=new D[n];L*q=new L[n];
- sort(l+,l+n+),q[head=tail=]=l[];
- for(int i=;i<=n;i++){
- while(head<tail && !Left(l[i],P[tail-]))tail--;
- while(head<tail && !Left(l[i],P[head])) head++;
- q[++tail]=l[i];
- if(fabs(Cross(q[tail].v,q[tail-].v))<eps){
- tail--;
- if(Left(q[tail],l[i].P))q[tail]=l[i];
- }
- if(head<tail)P[tail-]=Intersect(q[tail-],q[tail]);
- }
- while(head<tail && !Left(q[head],P[tail-]))tail--;
- if(tail-head<=)return ;
- P[tail]=Intersect(q[tail],q[head]);
- for(int i=head;i<=tail;i++)ans[++m]=P[i];
- return m;
- }
- const int maxn=+;
- int n,m,cnt;
- L l[maxn];
- D A[maxn],Temp,Last,Now;
- db a,b;
- int main(){
- scanf("%d",&n);
- while(n--){
- scanf("%d",&m);
- scanf("%lf%lf",&a,&b);
- Last=D(a,b);
- Temp=Last;
- for(int i=;i<=m;i++){
- scanf("%lf%lf",&a,&b);
- Now=D(a,b);
- l[++cnt]=L(Last,Now-Last);
- Last=Now;
- }
- l[++cnt]=L(Now,Temp-Now);
- }
- printf("%.3lf\n",Area(A,HPI(l,cnt,A)));
- return ;
- }
计算几何-BZOJ2618-凸包的交-HPI的更多相关文章
- hrbustoj 1318:蛋疼的蚂蚁(计算几何,凸包变种,叉积应用)
蛋疼的蚂蚁 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 39(22 users) Total Accepted: 26 ...
- poj 1696:Space Ant(计算几何,凸包变种,极角排序)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2876 Accepted: 1839 Descrip ...
- [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和
一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...
- 洛谷P4502 [ZJOI2018]保镖(计算几何+三维凸包)
题面 传送门 题解 我对计蒜几盒一无所知 顺便\(xzy\)巨巨好强 前置芝士 三维凸包 啥?你不会三维凸包?快去把板子写了->这里 欧拉公式 \[V-E+F=2\] \(V:vertex\)顶 ...
- CodeForces - 605C 凸包+直线与凸包判交
题目大意: 要完成两种属性p,q的需求,给定n个双属性物品及其单位个物品中含有的属性,要求选择最少的物品来达成属性需求.(可以选择实数个物品) 题解: 实际上是一种属性混合问题 我们知道对于两种双属性 ...
- HDU 6617 Enveloping Convex(凸包+半平面交+二分)
首先对于这m个点维护出一个凸包M,那么问题就变成了判断凸包P进行放大缩小能不能包含凸包M.(凸包P可以进行中心对称变换再进行放大缩小,见题意) 如何判断合适的相似比呢,我们可以用二分去放大缩小凸包P的 ...
- ZOJ 3871 Convex Hull(计算几何、凸包)
题意:给n个点,|x[i]|,|y[i]| <= 1e9.求在所有情况下的子集下(子集点数>=3),凸包的面积和. 这题主要有几个方面,一个是凸包的面积,可以直接用线段的有向面积和求得,这 ...
- 计算几何 : 凸包学习笔记 --- Graham 扫描法
凸包 (只针对二维平面内的凸包) 一.定义 简单的说,在一个二维平面内有n个点的集合S,现在要你选择一个点集C,C中的点构成一个凸多边形G,使得S集合的所有点要么在G内,要么在G上,并且保证这个凸多边 ...
- 计算几何--求凸包模板--Graham算法--poj 1113
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28157 Accepted: 9401 Description ...
随机推荐
- python语言基础3
一:python函数 是组织好的,可重复使用的,用来实现单一,或相关联功能的代码块.以前使用过的一些Python提供的内建函数,如print().max(4,18).min(100,50).当然我们自 ...
- SQLserver 数据类型转换
1:CAST 方法 CAST(任何有效的表达试 AS 要转换的数据类型 [数据类型的长度,可选]) 例:SELECT CAST(10000 as varchar(10)) SELECT CAS ...
- vue 截取字符串
let str = 'abcdef'; str = str.slice();//返回整个字符串 abcdef str = str.substring();//返回整个字符串 abcdef str = ...
- Linux 环境c++ 编码转换
#include <iconv.h> //代码转换:从一种编码转为另一种编码 static int CodeConvert(char *from_charset,char *to_char ...
- tcp与http协议 以及python的实现
htpp协议 Rquest Headers格式: 请求方法空格URL空格协议版本回车符换行符 头部字段名:值回车符换行符 ··· 头部字段名:值回车符换行符 回车符换行符 请求数据 socket网络聊 ...
- python爬虫匹配实现步骤
import requests,re url='https://movie.douban.com/top250' urlcontent=requests.get(url).text #正则 ''' 实 ...
- 题解【洛谷P3478】[POI2008]STA-Station
题面 设\(dp_i\)表示以\(i\)为根节点时所有节点的深度之和. 首先以 \(1\) 为根求出所有点深度之和\(dp_1\),并预处理每个点的子树大小. 设 \(v\) 是 \(u\) 的孩子, ...
- Apache 安装概要
1.apache下载参照百度 bin文件夹下命令行: httpd -k install 2.安装完成后排错记录 服务无法启动,到bin目录下运行 httpd.exe 查看输出,然后百度一下输出即 ...
- JVM&GC详解
1.JVM简介 JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器.它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序. ja ...
- SpringMVC:Controller配置总结
西部开源-秦疆老师:SpringMVC系列博客 , 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! SpringMVC:Controlle ...