bzoj1007:[HNOI2008]水平可见直线

本文介绍了一种通过斜率排序及单调栈维护的方法解决直线覆盖问题。该算法首先对所有直线按斜率进行排序,当斜率相同时选择截距更大的直线。接着使用单调栈来确定最终覆盖区间的直线集合,确保栈内直线满足特定条件。
摘要由CSDN通过智能技术生成

思路:首先按斜率排序,如果斜率相同就取截距最大的,显然截距小的会被覆盖而对答案没有贡献,然后考虑斜率不同的如何统计答案,可以用一个单调栈维护,当前新插入的直线显然斜率是要比当前栈顶斜率要大的,然后如果新插入的直线l[i]与stack[top]的交点在stack[top]与stack[top-1]的交点的右边,那么就不需要退栈直接加进来就好了,否则就要退栈直到条件成立。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 50005
#define eps 1e-7
 
int n,cnt,top,stack[maxn];
 
struct line{
    double k,b;
    int id;
    bool operator <(const line &a)const{return k<a.k ||(fabs(k-a.k)<eps && b<a.b);}
}l[maxn];
 
bool cmp(int a,int b){return l[a].id<l[b].id;}
 
double getpoint_x(line a,line b){
    return (b.b-a.b)/(a.k-b.k);
}
 
bool check(line a,line b,line c){
    return getpoint_x(a,b)>=getpoint_x(b,c);
}
 
int main(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%lf%lf",&l[i].k,&l[i].b),l[i].id=i;
    sort(l+1,l+n+1);
    for (int i=1;i<=n;i++){
        while (fabs(l[i].k-l[i+1].k)<eps) i++;
        while (top>=2 && check(l[stack[top-1]],l[stack[top]],l[i])) top--;
        stack[++top]=i;
    }
    sort(stack+1,stack+top+1,cmp);
    for (int i=1;i<=top;i++) printf("%d ",l[stack[i]].id);
    return 0;
}

 

转载于:https://www.cnblogs.com/DUXT/p/6006943.html

内容概要:该题库专为研究生入学考试计算机组成原理科目设计,涵盖名校考研真题、经典教材课后习题、章节题库和模拟试题四大核心模块。名校考研真题精选多所知名高校的计算机组成原理科目及计算机联考真题,并提供详尽解析,帮助考生把握考研命题趋势与难度。经典教材课后习题包括白中英《计算机组成原理》(第5版)和唐朔飞《计算机组成原理》(第2版)的全部课后习题解答,这两部教材被众多名校列为考研指定参考书目。章节题库精选代表性考题,注重基础知识与重难点内容,帮助考生全面掌握考试大纲要求的知识点。模拟试题依据历年考研真题命题规律和热门考点,精心编制两套全真模拟试题,并附标准答案,帮助考生检验学习成果,评估应试能力。 适用人群:计划参加研究生入学考试并报考计算机组成原理科目的考生,尤其是需要系统复习和强化训练的学生。 使用场景及目标:①通过研读名校考研真题,考生可以准确把握考研命题趋势与难度,有效评估复习成效;②通过经典教材课后习题的练习,考生可以巩固基础知识,掌握解题技巧;③通过章节题库的系统练习,考生可以全面掌握考试大纲要求的各个知识点,为备考打下坚实基础;④通过模拟试题的测试,考生可以检验学习成果,评估应试能力,为正式考试做好充分准备。 其他说明:该题库不仅提供详细的题目解析,还涵盖了计算机组成原理的各个方面,包括计算机系统概述、数据表示与运算、存储器分层、指令系统、中央处理器、总线系统和输入输出系统等。考生在使用过程中应结合理论学习与实践操作,注重理解与应用,以提高应试能力和专业知识水平
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值