区间重合判断-编程之美2.19

/**
思路:先合并区间, 然后二分判断给定区间是否在合并后的某个区间内。
**/
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstdlib>
#include <algorithm>
using namespace std;
struct Region {
    int start;
    int end;
    Region() {}
    Region(int start_, int end_) {
        start = start_;
        end = end_;
    }
    bool operator < (const Region& hs) const {
        if (start != hs.start) return start < hs.start;
        return end < hs.end;
    }
};
vector<Region> g_v;
int g_n = 0;
Region g_interval[50008];
int g_l = 0, g_r = 0;
void UnionInterval(Region* interval, int n) {
    if (NULL == interval || 0 > n) {
        fprintf(stderr, "UnionInterval: invalid arguments");
        exit(1);
    }
    g_v.clear();
    int l = 0, r = 0;
    for (int i = 0; i < n; ) {
        l = interval[i].start;
        r = interval[i].end;
        while (i < n && interval[i].start <= r) {
            r = max(r, interval[i].end);
            ++i;
        }
        g_v.push_back(Region(l, r));
    }
}
void Init() {
    for (int i = 0; i < g_n; i++) {
        scanf("%d %d", &g_interval[i].start, &g_interval[i].end);
    }
    scanf("%d%d", &g_l, &g_r);
}
int BinarySearch(vector<Region> &v, Region r);
void Work() {
    sort(g_interval, g_interval+g_n);
    UnionInterval(g_interval, g_n);
    for (int i = 0; i < (int)g_v.size(); i++) {
        printf("%d %d\n", g_v[i].start, g_v[i].end);
    }
    int ans = BinarySearch(g_v, Region(g_l, g_r));
    printf("ans = %d\n", ans);
}
int ContainIn(Region &a, Region& b) { // 判断a是否包含于b
    if (a.start < b.start) return 1;
    if (a.end > b.end) return -1;
    return 0;
}
int BinarySearch(vector<Region> &v, Region r) {
    int i = 0, j = (int)v.size()-1;
    while (i <= j) {
        int mid = i + ((j-i) >> 1);
        if (ContainIn(r, v[mid]) < 0) {
            i = mid + 1;
        } else if (ContainIn(r, v[mid]) > 0) {
            j = mid - 1;
        } else return 1;
    }
    return -1;
}
int main()
{
    freopen("in.txt", "r", stdin);
    while (EOF != scanf("%d", &g_n)) {
        Init();
        Work();
    }
    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章