BZOJ1007 [HNOI2008]水平可见直线 计算几何 单调栈维护上凸包
来源:互联网 发布:linux命令行设置中文 编辑:程序博客网 时间:2024/05/22 01:39
大家都很强,可与之共勉。
题意:
给您
其中
题解:
我们发现其实题目很像一个求开口向上的凸包。
于是我们考虑这个开口向上的凸包的性质,发现它是这样的
我们发现这样的图(橙色部分)从左往右它一定是斜率增加,横坐标依次增加(是句废话)。
所以我们这样去维护就可以了。
先考虑使斜率斜率递增,排序就可以了。
对于一条线的它被遮住了,当且仅当斜率比它大的线和斜率比它小的直线的交点横坐标小于它与斜率比它小的直线的交点横坐标(如图中的蓝点和红点,原谅色的线就
注意对于斜率相同的直线只保留最上面的。
代码如下:
STL大法好
/************************************************************** Problem: 1007 User: Lazer2001 Language: C++ Result: Accepted Time:424 ms Memory:4708 kb****************************************************************/# include <bits/stdc++.h># define N 50010std :: pair < double, double > l [N], lines [N] ;std :: vector < std :: pair < double, double > > st ;std :: map < std :: pair < double, double >, int > S ;# undef Ninline double Get_x ( std :: pair < double, double >& a, std :: pair < double, double >& b ) { return ( a.second - b.second ) / ( b.first - a.first ) ;}int main ( ) { int n ; scanf ( "%d", & n ) ; for ( int i = 1 ; i <= n ; ++ i ) { static double a, b ; scanf ( "%lf%lf", & a, & b ) ; l [i] = std :: make_pair ( a, b ) ; S [l [i]] = i ; } std :: sort ( l + 1, l + 1 + n ) ; int cnt ( 0 ) ; for ( int i = 1 ; i <= n ; ++ i ) { while ( l [i + 1].first == l [i].first && l [i + 1].second > l [i].second ) ++ i ; lines [++ cnt] = l [i] ; } for ( int i = 1 ; i <= cnt ; ++ i ) { while ( st.size ( ) > 1 && Get_x ( lines [i], st [st.size ( ) - 1] ) <= Get_x ( st [st.size ( ) - 2], st [st.size ( ) - 1] ) ) st.pop_back ( ) ; st.push_back ( lines [i] ) ; } std :: set < int > ans ; for ( std :: vector < std :: pair < double, double > > :: iterator it = st.begin ( ) ; it != st.end ( ) ; ++ it ) { ans.insert ( S.find ( *it ) -> second ) ; } for ( std :: set < int > :: iterator it = ans.begin ( ) ; it != ans.end ( ) ; ++ it ) { printf ( "%d ", *it ) ; }}
阅读全文
0 0
- BZOJ1007 [HNOI2008]水平可见直线 计算几何 单调栈维护上凸包
- [BZOJ1007][HNOI2008]水平可见直线(单调栈+计算几何)
- [BZOJ1007][HNOI2008]水平可见直线(单调栈+计算几何)
- 【XSY2138】【BZOJ1007】【HNOI2008】水平可见直线 几何 单调栈
- [bzoj1007][HNOI2008]水平可见直线(单调栈+几何)
- [BZOJ1007]HNOI2008水平可见直线|计算几何|栈
- 【bzoj1007】[HNOI2008]水平可见直线 单调栈
- 【单调栈】BZOJ1007 [HNOI2008]水平可见直线
- [bzoj1007][HNOI2008]水平可见直线 单调栈
- 【计算几何】[HNOI2008][HYSBZ/BZOJ1007]水平可见直线
- 【BZOJ1007】【HNOI2008】水平可见直线(计算几何 凸壳)
- BZOJ_P1007&Codevs_P2324 [HNOI2008]水平可见直线(计算几何+单调栈)
- 【几何】[HNOI2008][BZOJ1007]水平可见直线
- [BZOJ1007][HNOI2008]水平可见直线(单调栈)
- BZOJ1007(HNOI2008)[水平可见直线]--半平面交+单调栈
- [bzoj1007]:[HNOI2008]水平可见直线(单调栈)
- [BZOJ1007][HNOI2008]水平可见直线(栈)
- BZOJ1007 [HNOI2008]水平可见直线 贪心+栈
- JPA级联操作
- python安装及IDE推荐
- apk合并安装
- SourceInsight 技巧集锦
- 吴恩达 机器学习笔记八(lecture 8)(神经网络一)
- BZOJ1007 [HNOI2008]水平可见直线 计算几何 单调栈维护上凸包
- Tomcat – Java.Lang.OutOfMemoryError: PermGen Space 处理方法
- redis常用命令
- 如何才能成为超级人类,驯服人工智能?
- Msgpack序列化
- 实时监听输入框的值变化的时候,做相应处理
- dip1——introduction
- Recyclerview显示数据+GreenDao数据库+跳转传值(图片圆)+MVP
- decltype推导规则