<output id="vc7nm"></output>
<big id="vc7nm"><menuitem id="vc7nm"></menuitem></big>

    <meter id="vc7nm"></meter>

    BZOJ 1007, 水平可见直线

    2/10/2017来源:ASP.NET技巧人气:6879

    PRoblem

    传送门

    Mean

    参见题目描述。

    Analysis

    将直线按斜率排序,然后从小到大依次入栈,入栈时计算该直线与栈顶元素交点。 若该交点在栈顶元素与栈顶下一个元素交点的左侧(或重合),则栈顶元素被完整遮挡,出栈。 反复比较,全部操作完毕后栈中元素?#27425;?#21487;见水平直线。

    Code

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const double EPS=1e-10; const int N=50005; int n,top,s[N]; bool f[N]; struct Line{ int id; double a,b; bool Operator < (const Line &B) const { if(fabs(a-B.a)<EPS) return b<B.b; return a<B.a; } }l[N]; double Cross(Line A,Line B){return (B.b-A.b)/(A.a-B.a);} int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%lf%lf",&l[i].a,&l[i].b); l[i].id=i; } sort(l,l+n); for(int i=0;i<n;i++){ while(top){ if(fabs(l[s[top]].a-l[i].a)<EPS) top--; else if(top>1 && Cross(l[s[top]],l[i])<=Cross(l[s[top-1]],l[s[top]])) top--; else break; } s[++top]=i; } for(int i=1;i<=top;i++) f[l[s[i]].id]=1; for(int i=0;i<n;i++) if(f[i]) printf("%d ",i+1); return 0; }

    金诺时时彩软件怎么样

    <output id="vc7nm"></output>
    <big id="vc7nm"><menuitem id="vc7nm"></menuitem></big>

    <meter id="vc7nm"></meter>

    <output id="vc7nm"></output>
    <big id="vc7nm"><menuitem id="vc7nm"></menuitem></big>

    <meter id="vc7nm"></meter>
    福彩30选5开奖号码 捷豹的传说在线客服 德州扑克概率表 曾道 人是谁 7星彩预测最准专家 意甲球队萨索洛是不是恩波利 布莱顿大学是英国名校吗 安徽快3走势图一定牛 竞彩篮球胜分差什么意思 海王捕鱼逆变器