很像半平面交的一道题。题目是给了一些直线,想要从y轴,也就是二维平面从上向下看可以看到哪些直线,下边的直线会被上边的直线所覆盖了。
做法就是判断斜率以及截距排序,然后用一个双端队列来记录直线。如果当前判断的直线与队列尾的一条直线的在x轴的位置比之前的两条直线更偏左一些。那么前面的直线就会被被覆盖点。直接pop出来就可以了。
最后代码环节:
//god with me
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
//#define ll long long
#define int long long
//#define double long double
//#define double long long
#define re int
//#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
#define P pair < int , int >
using namespace std;
const int mod=4933;
//const int inf=1e18;
const int M=1e8;
const int N=1e5+5;//??????.???? 4e8
int ans[N],s[N],top;
struct line
{
int a,b,id;
}a[N];
bool cmp(line x,line y)
{
if(x.a!=y.a)return x.a>y.a;
return x.b>y.b;
}
double calc(int i,int j)
{
return((1.0*(a[i].b-a[j].b))/(a[j].a-a[i].a));
}
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].a>>a[i].b,a[i].id=i;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
if(a[i].a==a[i-1].a&&i>1) continue;
while(top>1&&calc(s[top],i)>=calc(s[top],s[top-1])) top--;
s[++top]=i;
ans[top]=a[i].id;
}
sort(ans+1,ans+1+top);
for(int i=1;i<=top;i++)cout<<ans[i]<<" ";
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}
/*
*/