Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)

Total Submission(s): 201 Accepted Submission(s): 77

Problem Description

There is a saying: Life is like a line, some people are your parallel lines, while others are destined to meet you.
Maybe have met, maybe just a matter of time, two unparallel lines will always meet in some places, and now a lot of life (i.e. line) are in the same coordinate system, in a given open interval, how many pairs can meet each other?

Input

There are several test cases in the input.
Each test case begin with one integer N (1 ≤ N ≤ 50000), indicating the number of different lines.
Then two floating numbers L, R follow (-10000.00 ≤ L < R ≤ 10000.00), indicating the interval (L, R).
Then N lines follow, each line contains four floating numbers x1, y1, x2, y2 (-10000.00 ≤ x1, y1, x2, y2 ≤ 10000.00), indicating two different points on the line. You can assume no two lines are the same one.
The input terminates by end of file marker.

Output

For each test case, output one integer, indicating pairs of intersected lines in the open interval, i.e. their intersection point’s x-axis is in (l, r).

Sample Input

3
0.0 1.0
0.0 0.0 1.0 1.0
0.0 2.0 1.0 2.0
0.0 2.5 2.5 0.0

Sample Output

1

Author

iSea @ WHU

Source

2010 ACM-ICPC Multi-University Training Contest(3)——Host by WHU

Recommend

zhouzeyong

题意:

给一个开区间(l,r),给n个直线,问这些直线在这段区间里面有多少个交点。‘’

思路:

如果暴力求解的话,时间复杂度为n^2,大概为10^11,肯定会超时。

由于题目将x的坐标限定在了一个区间(l,r)内,考虑如下情况:

设直线1分别与x=l,x=r相交与L1,R1;直线2分别相交于L2,R2。若两直线在此区间内相交,必有

L1<L2&&R1>R2  或者  L1>L2&&R1<R2

(想象若两直线在(l,r)相交,则经过交点后,纵坐标的大小顺序一定会改变)

此即为逆序数对的性质,于是题目转化为了求逆序数对的个数:

还需注意两点:

  • 1.与y轴平行的,只要这样的线在(l,r)范围内,则必定跟别的不平行线相交。所以计算下个数再乘以不与y轴平行的线的个数 
  • 2.就能使在l和r上的交点不计算在内,需要在排序时注意下(当l相同时,按r排序;当r相同时,按l排序)

    另外很重要的一点,数据为实型数,需要对数据进行离散化处理,如此才能应用树状数组

  • 关于离散化:http://blog.csdn.net/gokou_ruri/article/details/7723378

    代码:

    #include<bits/stdc++.h>
    using namespace std; #define lowbit(x) (x&(-x))
    const int N=5e4+10;
    struct node{
    double a,b;
    int num;
    };
    node e[N];
    int c[N];
    double l,r; int cmp1(node x,node y) //left 递增排序
    {
    if(x.a==y.a)
    return x.b<y.b;
    return x.a<y.a;
    } int cmp2(node x,node y) //right 递减排序
    {
    if(x.b==y.b)
    return x.a>y.a;
    return x.b>y.b;
    } void add(int x,int val)
    {
    while(x<N)
    {
    c[x]+=val;
    x+=lowbit(x);
    }
    } int sum(int x)
    {
    int ans=0;
    while(x>0)
    {
    ans+=c[x];
    x-=lowbit(x);
    }
    return ans;
    } int main()
    {
    int n;
    int t,tt,i,j,ans;
    double x1,y1,x2,y2,k,b; while(scanf("%d",&n)!=EOF)
    {
    t=tt=0;
    ans=0;
    scanf("%lf%lf",&l,&r);
    for(i=0;i<n;i++)
    {
    scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);//两个点的横纵坐标
    if(x1==x2)//横坐标相等 表示竖直的线 平行与y轴
    {
    if(l<x1&&x1<r)
    tt++;
    continue;
    }
    k=(y2-y1)/(x2-x1);//y=kx+b
    b=y1-k*x1;
    e[t].a=l*k+b;
    e[t++].b=r*k+b;
    }
    //******************//
    //离散化,由于想树状数组中add的是left,所以只对left离散化即可
    sort(e,e+t,cmp1);
    for(i=0;i<t;i++)//编号
    e[i].num=i+1;//树状数组无下标0
    //*******************//
    sort(e,e+t,cmp2);//递减排序 3412
    memset(c,0,sizeof(c));
    for(i=0;i<t;i++)//统计
    {
    add(e[i].num,1);
    ans+=sum(e[i].num-1);
    }
    printf("%d\n",ans+tt*t);//加上平行y轴的直线所产生的交点
    }
    }
  • HDU3465--Life is a Line(树状数组求逆序数,离散化)的更多相关文章

    1. poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)

      题目链接:http://poj.org/problem?id=2299 Description In this problem, you have to analyze a particular so ...

    2. poj 2299 树状数组求逆序数+离散化

      http://poj.org/problem?id=2299 最初做离散化的时候没太确定可是写完发现对的---由于后缀数组学的时候,,这样的思维习惯了吧 1.初始化as[i]=i:对as数组依照num ...

    3. hdu 5147 Sequence II (树状数组 求逆序数)

      题目链接 Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

    4. poj 2299 Ultra-QuickSort(树状数组求逆序数)

      链接:http://poj.org/problem?id=2299 题意:给出n个数,求将这n个数从小到大排序,求使用快排的需要交换的次数. 分析:由快排的性质很容易发现,只需要求每个数的逆序数累加起 ...

    5. SGU180 Inversions(树状数组求逆序数)

      题目: 思路:先离散化数据然后树状数组搞一下求逆序数. 离散化的方法:https://blog.csdn.net/gokou_ruri/article/details/7723378 自己对用树状数组 ...

    6. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

    7. Codeforces645B【树状数组求逆序数】

      题意: 给你1-n的序列,然后有k次机会的操作,每一次你可以选择两个数交换. 求一个最大的逆序数. 思路: 感觉就是最后一个和第一个交换,然后往中间逼近,到最终的序列,用树状数组求一下逆序数. #in ...

    8. hdu5792 World is Exploding(多校第五场)树状数组求逆序对 离散化

      题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5792 题目描述:给你n个值,每个值用A[i]表示,然后问你能否找到多少组(a,b,c,d)四个编号,四 ...

    9. HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)

      Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

    随机推荐

    1. [转帖]Ubuntu 对应内核版本

      带有相应Linux内核版本的Ubuntu版本列表 https://www.helplib.com/ubuntu/article_155943   问题: 是否有带有默认对应的Linux内核版本的Ubu ...

    2. .Net Core IIS下无Log4Net日志输出,命令行下却有(dotnet运行)

      .Net Core IIS下无Log4Net日志输出,命令行下却有(dotnet运行) 遇到个诡异的问题,项目发布并寄宿到 IIS上后,Log4Net没有日志输出 1.原因分析 这不应该啊,所有的配置 ...

    3. opencv学习之等待按键事件-waitKey函数

      文章来源: https://mangoroom.cn/opencv/opencv-learning-waitKey.html 序 waitKey函数属于opencv函数里既常用又非常基础的函数,无论是 ...

    4. gcc数据对齐之: howto 1.

      GCC支持用__attribute__为变量.类型.函数.标签指定特殊属性.这些不是编程语言标准里的内容,而属于编译器对语言的扩展. 本文介绍其中的两个属性:aligned和packed. align ...

    5. Appium+Python之获取toast

      思考:手机APP上的必填或错误文本提示一般1-2s就会消失,比较难定位,所以一般的固定元素定位方式是不可用的,那我们如何定位toast呢? 前提:1.Appium1.6.3以上(包括1.6.3) 2. ...

    6. 去除富文本中的html标签及vue、react、微信小程序中的过滤器

      在获取富文本后,又只要显示部分内容,需要去除富文本标签,然后再截取其中一部分内容:然后就是过滤器,在微信小程序中使用还是挺多次的,在vue及react中也遇到过 1.富文本去除html标签 去除htm ...

    7. OpenCV处理文件、视频和摄像头

      图像的本质(图像可以用数组来表示) import numpy as np import cv2 img = np.zeros((3, 3), dtype=np.uint8) print(img, im ...

    8. [转载]Linux软件包及dpkg\apt等方法

      Linux软件安装 来源:https://segmentfault.com/a/1190000011200004?share_user=1030000007255638 一.安装包分类 在Linux平 ...

    9. 剑指offer 剪绳子

      题目描述 给你一根长度为n的绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m].请问k[0]xk[1]x...xk[m]可能 ...

    10. vue、iview动态菜单(可折叠)

      vue项目与iview3实现可折叠动态菜单. 菜单实现一下效果: 动态获取项目路由生成动态三级菜单导航 可折叠展开 根据路由name默认打开子目录,选中当前项 自动过滤需要隐藏的路由(例:登陆) 在手 ...