bzoj1007题解
【题意分析】
给你n个上半平面,求包含这些上半平面的交的上半平面。
【解题思路】
按斜率排序,用单调栈维护一个下凸壳即可。复杂度O(nlog2n)。
【参考代码】
#include <cctype>
#include <cmath>
#include <cstdio>
#define REP(I,start,end) for(int I=(start);I<=(end);I++)
#define PER(I,start,end) for(int I=(start);I>=(end);I--)
inline int space()
{
return putchar(' ');
}
inline int enter()
{
return putchar('\n');
}
inline bool eoln(char ptr)
{
return ptr=='\n';
}
inline bool eof(char ptr)
{
return ptr=='\0';
}
inline int getint()
{
char ch=getchar();
for(;!isdigit(ch)&&ch!='+'&&ch!='-';ch=getchar());
bool impositive=ch=='-';
if(impositive)
ch=getchar();
int result=;
for(;isdigit(ch);ch=getchar())
result=(result<<)+(result<<)+ch-'';
return impositive?-result:result;
}
template<typename integer> inline int write(integer n)
{
integer now=n;
bool impositive=now<;
if(impositive)
{
putchar('-');
now=-now;
}
char sav[];
sav[]=now%+'';
int result=;
for(;now/=;sav[result++]=now%+'');
PER(i,result-,)
putchar(sav[i]);
return result+impositive;
}
template<typename real> inline bool fequals(real one,real another,real eps=1e-)
{
return fabs(one-another)<eps;
}
template<typename real> inline bool funequals(real one,real another,real eps=1e-)
{
return fabs(one-another)>=eps;
}
template<typename T=double> struct Point
{
T x,y;
Point()
{
x=y=;
}
Point(T _x,T _y)
{
x=_x;
y=_y;
}
bool operator==(const Point<T> &another)const
{
return fequals(x,another.x)&&fequals(y,another.y);
}
bool operator!=(const Point<T> &another)const
{
return funequals(x,another.x)||funequals(y,another.y);
}
Point<T> operator+(const Point<T> &another)const
{
Point<T> result(x+another.x,y+another.y);
return result;
}
Point<T> operator-(const Point<T> &another)const
{
Point<T> result(x-another.x,y-another.y);
return result;
}
Point<T> operator*(const T &number)const
{
Point<T> result(x*number,y*number);
return result;
}
Point<double> operator/(const T &number)const
{
Point<double> result(double(x)/number,double(y)/number);
return result;
}
double theta()
{
return x>?(y<)**M_PI+atan(y/x):M_PI+atan(y/x);
}
double theta_x()
{
return !x?M_PI/:atan(y/x);
}
double theta_y()
{
return !y?M_PI/:atan(x/y);
}
};
template<typename T> inline T dot_product(Point<T> A,Point<T> B)
{
return A.x*B.x+A.y*B.y;
}
template<typename T> inline T cross_product(Point<T> A,Point<T> B)
{
return A.x*B.y+A.y*B.x;
}
template<typename T> inline T SqrDis(Point<T> a,Point<T> b)
{
return sqr(a.x-b.x)+sqr(a.y-b.y);
}
template<typename T> inline double Euclid_distance(Point<T> a,Point<T> b)
{
return sqrt(SqrDis(a,b));
}
template<typename T> inline T Manhattan_distance(Point<T> a,Point<T> b)
{
return fabs(a.x-b.x)+fabs(a.y-b.y);
}
template<typename T=double> struct kbLine
{
//line:y=kx+b
T k,b;
kbLine()
{
k=b=;
}
kbLine(T _k,T _b)
{
k=_k;
b=_b;
}
bool operator==(const kbLine<T> &another)const
{
return fequals(k,another.k)&&fequals(b,another.b);
}
bool operator!=(const kbLine<T> &another)const
{
return funequals(k,another.k)||funequals(b,another.b);
}
bool operator<(const kbLine<T> &another)const
{
return k<another.k;
}
bool operator>(const kbLine<T> &another)const
{
return k>another.k;
}
template<typename point_type> inline bool build_line(Point<point_type> A,Point<point_type> B)
{
if(fequals(A.x,B.x))
return false;
k=T(A.y-B.y)/(A.x-B.x);
b=A.y-k*A.x;
return true;
}
double theta_x()
{
return atan(k);
}
double theta_y()
{
return theta_x()-M_PI/;
}
};
template<typename T> bool parallel(kbLine<T> A,kbLine<T> B)
{
return A!=B&&(fequals(A.k,B.k)||A.k!=A.k&&B.k!=B.k);
}
template<typename T> Point<double> *cross(kbLine<T> A,kbLine<T> B)
{
if(A==B||parallel(A,B))
return NULL;
double _x=double(B.b-A.b)/(A.k-B.k);
Point<double> *result=new Point<double>(_x,A.k*_x+A.b);
return result;
}
//======================================Header Template=====================================
#include <algorithm>
using namespace std;
int stack[];
struct _line
{
kbLine<> _l;
int order;
bool operator<(const _line &T)const
{
return _l<T._l||parallel(_l,T._l)&&_l.b>T._l.b;
}
}lines[];
inline bool Order(int A,int B)
{
return lines[A].order<lines[B].order;
}
int main()
{
int n=getint();
REP(i,,n)
{
lines[i].order=i;
scanf("%lf%lf",&lines[i]._l.k,&lines[i]._l.b);
}
sort(lines+,lines+n+);
int top=stack[]=,i=;
while(i<=n)
{
for(;i<=n&&(lines[i]._l==lines[stack[top]]._l||parallel(lines[i]._l,lines[stack[top]]._l));i++);
for(;i<=n&&top>;top--)
{
Point<double> *last=cross(lines[stack[top-]]._l,lines[stack[top]]._l),*now=cross(lines[i]._l,lines[stack[top]]._l);
if(last->x<now->x)
break;
}
stack[++top]=i++;
}
sort(stack+,stack+top+,Order);
REP(i,,top)
{
write(lines[stack[i]].order);
space();
}
enter();
return ;
}
bzoj1007题解的更多相关文章
- 【BZOJ1007】水平可见直线(单调栈)
[BZOJ1007]水平可见直线(单调栈) 题解 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的 ...
- 【BZOJ1007】[HNOI2008]水平可见直线 半平面交
[BZOJ1007][HNOI2008]水平可见直线 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
随机推荐
- Windows添加右键新增.md文件
因为习惯用Markdown来写文档, 所以常常需要新建.md文档,但由于Windows并不会自带把.md文档放入右键新建项中(像Word那样),所以方便起见,自己手动设置,其实就是把它写进Window ...
- Java高并发网络编程(二)BIO
一.阻塞 服务器端 public class BIOServer { public static void main(String[] args) throws Exception { ServerS ...
- loadrunner——win7+LR11配置
一. 安装vmware虚拟机 下载安装vmware15后,可使用密钥为:CG392-4PX5J-H816Z-HYZNG-PQRG2 二. 安装win7系统 2.1下载win7镜像文件 2.2 vmwa ...
- SQL 删除
SQL Delete 语句(删除表中的记录) DELETE语句用于删除表中现有记录. SQL DELETE 语句 DELETE 语句用于删除表中的行. SQL DELETE 语法 DELETE FRO ...
- vue笔记一:设置表头的背景颜色以及下边框颜色
最近做的一个项目有个小小的需求,就是把表头的背景颜色改为黑色,表格边框颜色改为这个颜色,中间出了些问题,因为vue的表格样式是内联样式,一修改就影响到其他地方的表格样式,尽管我单独加了id还是不行,经 ...
- CF232E Quick Tortoise , Fzoj 3118
这一题由于数据较多,我们考虑离线处理. 分治.对于两个点s,t,如果起点在mid这条横线上方,终点在下方,那么它必定会穿过mid这条线.所以只要s可以到mid上一点x,x可以到t,st就是安全的. 用 ...
- php 空格,换行,跳格使用说明
首先说说\n,\r,\t \n 软回车: 在Windows 中表示换行且回到下一行的最开始位置 在Linux.unix 中只表示换行,但不会回到下一行的开始位置. \r 软空格: 在Linux.uni ...
- bzoj1211树的计数 x bzoj1005明明的烦恼 题解(Prufer序列)
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3432 Solved: 1295[Submit][Stat ...
- 剑指offer——二进制中1的个数(c++)
题目描述实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如,把9表示成二进制是1001,则输出为2 常规解法首先把n和1做位运算,判断n的最低位是不是1,然后把1左移一位得到2,再把n和2 ...
- css 导航样式
html 结构 <div class="nav-menu float-r"> <ul class="menu-item"> <l ...