首页 > 其他 > 详细

[HNOI2008]水平可见直线 单调栈

时间:2018-10-30 20:25:16      阅读:140      评论:0      收藏:0      [点我收藏+]

Code:

#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
void setIO(string a){
	freopen((a+".in").c_str(),"r",stdin);
}
const int maxn=100000+5;
struct Line{
	double slope, y;
}line[maxn];
int arr[maxn],ans[maxn],S[maxn],top;
bool cmp(int i,int j){
	if(line[i].slope==line[j].slope) return line[i].y>line[j].y;
	return line[i].slope<line[j].slope;
}
double get(int i,int j){
	return (line[i].y-line[j].y)/(line[j].slope-line[i].slope);
}
int main(){
	//setIO("input");
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;++i) {
		scanf("%lf%lf",&line[i].slope,&line[i].y);
		arr[i]=i;
	}
	sort(arr+1,arr+1+n,cmp);
    for(int i=1;i<=n;++i)
    {
    	int cur=arr[i];
  
    	if(line[cur].slope==line[arr[i-1]].slope && i!=1) continue;
    	while(top>1 && get(S[top],S[top-1])>=get(arr[i],S[top])) --top;
    	S[++top]=cur;
    	ans[top]=cur;
    }
    sort(ans+1,ans+1+top);
    for(int i=1;i<=top;++i) printf("%d ",ans[i]);
    return 0;
}

  

 

[HNOI2008]水平可见直线 单调栈

原文:https://www.cnblogs.com/guangheli/p/9879068.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!