2.19 区间重合判断

问题:

1. 给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。

2. 给定一个窗口区域和系统界面上的N个窗口,判断这个窗口区域是否被已有的窗口覆盖。

1. 解法:

先用区间的左边界值对目标区间进行排序O(nlogn),对排好序的区间进行合并O(n),对每次待查找的源区间,用二分查出其左右两边界点分别处于合并后的哪个源区间中O(logn),若属于同一个源区间则说明其在目标区间中,否则就说明不在。

代码:

#include <iostream>
#include <algorithm>

using namespace std;

struct node {
    int x;
    int y;
};

int n;

bool cmp(node a, node b) {
    if(a.x != b.x) return a.x < b.x;
    if(a.x == b.x) return a.y < b.y;
    return true;
}

bool branch_search(node *A, int x, int y, node v) {
    int m;
    while(x < y) {
        m = x + (y - x) / 2;
        if(A[m].x < v.x && A[m].y > v.y) return true;
        else if(A[m].x < v.x) x = m+1;
        else if(A[m].x > v.x) y = m-1;
    }
    return false;
}

int main() {
    cin >> n;
    node target;
    node a[100];
    cin >> target.x >> target.y;
    for(int i = 0; i < n; ++i) cin >> a[i].x >> a[i].y;
    sort(a, a+n, cmp);
    node b[100];
    int count = 0;
    for(int i = 0; i < n-1; ++i) {
        int j = i;
        b[count].x = a[i].x;
        while(a[j].y > a[j+1].x) {
            a[j].y = a[j+1].y;
            j++;
        }
        b[count].y = a[j].y;
        i = j;
        count++;
    }
    bool ans = branch_search(b, 0, count, target);
    if(ans) cout << "YES" << endl;
    else cout << "NO" << endl;
    return 0;
}
时间: 2024-08-09 00:19:14

2.19 区间重合判断的相关文章

【编程之美】2.19 区间重合判断

题目: 给定一个目标区间[x,y]和N个无序的源区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内. 思路:把源区间按x从小到大排序,再把区间依次合并,每完整得到一个合并区间后,判断[x,y]是否在合并区间内. #include <stdio.h> #include <stdlib.h> typedef struct { int x; int y; }Region; int cmp(const void * a, const void

第2章 数字之魅——区间重合判断

区间重合判断 问题描述 分析与解法 [解法一] 具体代码如下: 1 package chapter2shuzizhimei.qujianchonghe; 2 /** 3 * 区间重合判断 4 * @author DELL 5 * 6 */ 7 public class IntervalOverlap { 8 //区间类 9 public static class Interval{ 10 public double x; //区间左端点 11 public double y; //区间右端点 1

区间重合判断[poj2808 校门外的树]

题目:http://bailian.openjudge.cn/practice/2808/ 参考了文章,重写了代码:http://www.cnblogs.com/youxin/p/3266617.html(注:原文解法2代码有误) 解法1:以空间换时间 #include <iostream> using namespace std; int main() { int L, M, i, start, end, count; bool trees[10001]; for (i = 0; i <

编程之美——区间重合判断

将源区间按照x坐标大小排序,然后进行合并,使用二分查找目标区间x,y坐标在源区间中的分布,若两者分布于同一连续区间,则区间重合 代码: 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 struct section 6 { 7 int low; 8 int high; 9 bool operator<(const section &l)const 10 { 11 return l

【编程之美】区间重合判断

给定一个源区间[x,y](y>=x)和N个无序的目标区间[x1,y1] [x2,y2] [x3,y3] [xn,yn],判断源区间[x,y]是不是在目标区间内? 例如:给定源区间[1,6]和一组无序的目标区间[2,3] [1,2] [3,9],即可认为区间[1,6]在区间[2,3] [1,2] [3,9]内(因为目标区间实际上是[1,9]). 分析与解法 方法一:直接法 一个比较直接的思路即将源区间和目标区间逐个投影到坐标轴上,只考察源区间未被覆盖的部分.如果所有的区间全部投影完毕,仍然有源区间

[算法]区间重合判断

题目描述: 给定一个源区间 [x,y]和N个无序的目标区间[x1,y1],[x2,y2],...[xn,y,],判断给定的源区间[x,y]在不在目标区间内. 例如:给定源区间[1 6]和目标区间[1 2][2 4][4 9]即可认为区间[1 6]在目标区间内,因为源区间的并集为[1 9 ]. 试想一下,现在在这样的一个目标区间的集合, 需要频繁地去查询一个区间是否在该集合中.那么怎么样才能降低单次查询的复 杂度呢.预处理.对区间的预处理可以满足这样的需求. 直接上方法: 第一步: 首先对区间进行

[算法]区间重合推断

题目描写叙述: 给定一个源区间 [x,y]和N个无序的目标区间[x1,y1],[x2,y2],...[xn,y,],推断给定的源区间[x,y]在不在目标区间内. 比如:给定源区间[1 6]和目标区间[1 2][2 4][4 9]就可以觉得区间[1 6]在目标区间内,由于源区间的并集为[1 9 ]. 试想一下,如今在这种一个目标区间的集合. 须要频繁地去查询一个区间是否在该集合中.那么怎么样才干减少单次查询的复 杂度呢.预处理.对区间的预处理能够满足这种需求. 直接上方法: 第一步: 首先对区间进

区间重叠判断算法

1.Begin = Max(A1 , B1) ; 2.End = Min(A2 , B2) ; 3.Len = End - Begin 如果Len >= 0,那么区间AB重叠,重叠部分为Len:否则不重叠.

java 区间重叠判断

百度后看了一些解法,效率虽可能比较高,但相对代码太复杂,不便于阅读与代码交接,自己写了下,方法如下. 方法一: private void checkOverlap(LinkedList<ActiveExtendDTO> activeExtendDOList) { activeExtendDOList.sort(Comparator.comparing(ActiveExtendDTO::getCommodityMinNum)); Long temp = activeExtendDOList.po