zoukankan      html  css  js  c++  java
  • [HNOI2008]水平可见直线

    按斜率排序后画个图,用单调栈维护这个半平面交

    # include <bits/stdc++.h>
    # define IL inline
    # define RG register
    # define Fill(a, b) memset(a, b, sizeof(a))
    using namespace std;
    typedef long long ll;
    const int _(50010), INF(2147483647);
    
    IL ll Read(){
        RG char c = getchar(); RG ll x = 0, z = 1;
        for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
        for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
        return x * z;
    }
    
    int n, a[_], b[_], id[_], s[_], top;
    
    IL bool Cmp(RG int x, RG int y){  return a[x] != a[y] ? a[x] < a[y] : b[x] < b[y];  }
    
    IL double Cross(RG int x, RG int y){  return 1.0 * (b[y] - b[x]) / (1.0 * (a[x] - a[y]));  }
    
    int main(RG int argc, RG char* argv[]){
        n = Read();
        for(RG int i = 1; i <= n; ++i) a[i] = Read(), b[i] = Read(), id[i] = i;
        sort(id + 1, id + n + 1, Cmp);
        for(RG int i = 1; i <= n; ++i){
            while(top && a[id[i]] == a[s[top]]) --top;
            while(top > 1 && Cross(s[top - 1], s[top]) >= Cross(s[top - 1], id[i])) --top;
            s[++top] = id[i];
        }
        sort(s + 1, s + top + 1);
        for(RG int i = 1; i <= top; ++i) printf("%d ", s[i]);
        return 0;
    }
  • 相关阅读:
    python读取配置文件
    日志截取
    QJsonObject
    OpenStack
    生成器迭代器正则视频笔记
    使用Qt.createComponent 动态加载组件
    linux 远程执行命令
    Django 建立工程连接数据库
    arm基础1
    QSetting的用法
  • 原文地址:https://www.cnblogs.com/cjoieryl/p/8206314.html
Copyright © 2011-2022 走看看