ZOJ 3967 Colorful Rainbows --栈的应用

题意:给出n条y=ai*x+bi的直线。对于这些直线,如果存在x使得该直线y大于其他任意一直线,那么这条直线可以被看见,问有多少条直线可以被看见。

做法什么的不讲了,参见:http://blog.csdn.net/ten_three/article/details/12289427  以及  http://blog.sina.com.cn/s/blog_7eee8bf3010136d8.html

利用了堆栈来做,总体复杂度O(nlogn)

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define N 5006

struct node
{
    double x,y;
}p[N],line[N];
node stk[N];

int cmp(node ka,node kb)
{
    if(ka.x == kb.x)
        return ka.y < kb.y;
    return ka.x < kb.x;
}

double calc(node ka,node kb)
{
    double res = (ka.y-kb.y)*1.0/(kb.x-ka.x);
    return res;
}

int main()
{
    int t,m,n,k;
    double now,pre;
    int i,j;
    int tail;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        sort(p,p+n,cmp);
        k = 0;
        for(i=0;i<n-1;i++)
        {
            if(p[i].x != p[i+1].x)
                line[k++] = p[i];
        }
        line[k++] = p[n-1];
        if(k < 2)
        {
            printf("%d\n",k);
            continue;
        }
        tail = 0;
        stk[tail++] = line[0];
        stk[tail++] = line[1];
        pre = calc(stk[1],stk[0]);
        int ans = 2;
        for(i=2;i<k;i++)
        {
            now = calc(line[i],stk[tail-1]);
            while(now <= pre)
            {
                tail--;
                if(tail >= 2)
                {
                    pre = calc(stk[tail-1],stk[tail-2]);
                    now = calc(line[i],stk[tail-1]);
                }
                else
                {
                    now = calc(line[i],stk[tail-1]);
                    break;
                }
            }
            stk[tail++] = line[i];
            pre = now;
        }
        printf("%d\n",tail);
    }
    return 0;
}

ZOJ 3967 Colorful Rainbows --栈的应用

时间: 2024-10-11 19:51:04

ZOJ 3967 Colorful Rainbows --栈的应用的相关文章

ZOJ 2967 Colorful Rainbows 【Stack】

解决此题方法类似于凸包,先把所有直线按照斜率a由小到大排序 斜率相同取b较大的,扔掉b小的 (可以在遍历的时候忽视).于是所有直线斜率不同. 准备一个栈 (手动模拟), 栈里面存放上一次能看到的“最上面”的直线以及这条直线能看到的范围x (x值右边的部分可以被看到). 初始时,把斜率最小的直线入栈,并记录x值为-inf.然后对第i条直线, 所做的是用第i条直线和栈顶直线求交点x,如果这个x值不大于栈顶的x值, 则把栈顶元素弹出,继续求交,否则退出.这种判断操作直到栈为空, 或者当前栈顶的x值大于

zoj 2967 Colorful Rainbows (堆栈应用)

题意:给出n条y=ai*x+bi的直线.对于这些直线,如果存在x使得该直线y大于其他任意一直线,那么这条直线可以被看见,问有多少条直线可以被看见. 思路:首先去重,将那些a值相同的直线取其中b最大的那条保留下来,其他的全删掉. 其次将直线按照a值从小到大排序,因为斜率不同,所以任意两条直线都会相交.而这些直线是按照斜率从小到大进行排序,所以当x小于其交点x值时,斜率小的y值大. 利用这一特性将,先让线入栈.若将入栈的线与栈顶线的交点x值小于栈顶两条线的的交点的x值,则将栈顶线出栈,继续进行上一次

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116

七方件业金离以提领前群约会ODjdidtlwfWv

为了从不同环节,尤其与广大使用人群直接关系的环节反映质量状况,对共享自行车投放点.运营仓库.生产企业等不同环节的产品抽查,覆盖了共享自行车从成品出厂到待投放的关键环节. 该负责人称,根据新车投放情况,结合共享自行车行业市场占有分布特点,本次重点抽查了摩拜.ofo.Hellobike三个品牌的产品,占本次抽查批次总数的83.3%.其中,在天津.无锡.武汉.广州.深圳.东莞6个城市抽查了9批次摩拜产品,占产品抽查批次总数的37.5%,抽查批次合格率88.9%,抽查不合格的1批次产品为待投放于广州市的

ZOJ 3643 kmp+栈处理失配指针

当kmp在母串中匹配到子串之后,删去子串相当于把失配指针往回退到匹配位置的前一个,如果只回退一次的话,直接用数组就可以处理失配指针了,但是本题可能删除后存在多个子串,所以用栈把失配指针位置先存起来,然后找到一次把len长度的失配指针删去,然后栈顶元素就是第一句话说的回退出匹配位置的前一个了. 为了方便调用函数,把以前的kmp改成了接口,方便使用,这样就不用开全局变量的数组了,代码看起来更符合工作中开发的代码风格. #include <iostream> #include <cstdio&

hihoCoder - 1103 - Colorful Lecture Note (栈~~)

#1103 : Colorful Lecture Note 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi is writing an algorithm lecture note for Little Ho. To make the note more comprehensible, Little Hi tries to color some of the text. Unfortunately Little Hi is using a pla

zoj 2615 Cells 栈的运用

题目链接:ZOJ - 2615 Scientists are conducting research on the behavior of a newly discovered Agamic Cellular Microbe. This special kind of microbe is capable of massively reproducing by itself in a short time. The lifetime of an ACM consists of three pha