当前位置: 首页 > news >正文

[HNOI2008]水平可见直线

看似一个半平面交

但是一般的半平面交用求的是凸包,这个是一个凸壳。封闭区间和半开放区间还是有区别的。

当然一般的半平面交其实可以,只要把向量的方向设对即可(只有1/4象限的向量)

 

但是既然直接给了斜率的话,而且半开放的区间,还有一个简单一些的做法:

考虑直线按照斜率排序,斜率相同纵截距排序

两个栈,一个维护交点,一个维护直线

加入一个直线,如果和最后一个直线的交点在前一个交点的左方(或者重合),那么这个直线和交点都被盖住了。

不断一起弹栈

画个图就很好理解。

O(nlogn+n)

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
    char ch;x=0;bool fl=false;
    while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
    for(x=numb;isdigit(ch=getchar());x=x*10+numb);
    (fl==true)&&(x=-x);
}
namespace Miracle{
const int N=50000+5;
struct po{
    double x,y;
    bool friend operator <(po a,po b){
        if(a.x!=b.x) return a.x<b.x;
        return a.y>=b.y;
    }
}sta[N];
int top1;
int n;
struct line{
    int k,b;
    int id;
    bool friend operator <(line a,line b){
        if(a.k==b.k) return a.b>b.b;
        return a.k<b.k;
    }
}l[N],zhan[N];
int top2;
int ans[N],tot;
po calc(line a,line b){//warning!!! pingxing !!
    po ret;
    ret.x=((double)b.b-(double)a.b)/((double)a.k-(double)b.k);
    ret.y=b.k*ret.x+b.b;
    return ret;
}
int main(){
    rd(n);
    for(reg i=1;i<=n;++i){
        rd(l[i].k);rd(l[i].b);
        l[i].id=i;
    }
    sort(l+1,l+n+1);
    zhan[++top2]=l[1];
    for(reg i=2;i<=n;++i){
        while(i<=n&&l[i].k==l[i-1].k) ++i;
        if(i>n) break;
        while(top1&&calc(l[i],zhan[top2])<sta[top1]){
            --top1;--top2;
        }
        sta[++top1]=calc(l[i],zhan[top2]);
        zhan[++top2]=l[i];
    }
    for(reg i=1;i<=top2;++i){
        ans[++tot]=zhan[i].id;
    }    
    sort(ans+1,ans+tot+1);
    for(reg i=1;i<=tot;++i){
        printf("%d ",ans[i]);
    }
    return 0;
}

}
signed main(){
    Miracle::main();
    return 0;
}

/*
   Author: *Miracle*
   Date: 2018/12/26 15:19:22
*/
View Code

 

一个不错的应用题是:

12.26模拟赛T2

转化之后就是横着的“水平可见直线”

 

转载于:https://www.cnblogs.com/Miracevin/p/10182519.html

相关文章:

  • 电商产品设计实战(二):电商整体产品架构
  • Integer类toString(int i,int radix)方法
  • 普通java工程的resources目录寻址
  • express.js的介绍及使用
  • Intel要在中国投35亿美金造这种闪存,3DxPoint技术牛在哪里?
  • MongoDB系统CentOS 7.1 crash的排障过程
  • MySQL建表语句转PostgreSQL建表语句全纪录
  • JAVA设计模式之观察者模式
  • 安装mongo,新建数据库,添加普通用户
  • 【EOS】Cleos基础
  • 视频课左右滑动后应该定位
  • 2019智能合约开发新趋势
  • Tmux教程
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • echarts的各种常用效果展示
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Git的一些常用操作
  • isset在php5.6-和php7.0+的一些差异
  • React-flux杂记
  • React-redux的原理以及使用
  • Theano - 导数
  • tweak 支持第三方库
  • Vue 重置组件到初始状态
  • Windows Containers 大冒险: 容器网络
  • 包装类对象
  • 当SetTimeout遇到了字符串
  • 解析 Webpack中import、require、按需加载的执行过程
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 强力优化Rancher k8s中国区的使用体验
  • 网络应用优化——时延与带宽
  • 学习Vue.js的五个小例子
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • Semaphore
  • 阿里云服务器购买完整流程
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • (10)STL算法之搜索(二) 二分查找
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (52)只出现一次的数字III
  • (C语言)fgets与fputs函数详解
  • (C语言)字符分类函数
  • (Matlab)使用竞争神经网络实现数据聚类
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)springboot掌上博客系统 毕业设计063131
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net refrector
  • .Net 高效开发之不可错过的实用工具
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net操作Excel出错解决
  • .NET开源快速、强大、免费的电子表格组件
  • .php文件都打不开,打不开php文件怎么办
  • .pop ----remove 删除
  • @ComponentScan比较
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限