[hihoCoder] #1305 : 区间求差 解题报告

原创 2016年05月30日 11:47:49

题目链接: http://hihocoder.com/problemset/problem/1305

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定两个区间集合 A 和 B,其中集合 A 包含 N 个区间[ A1A2 ], [ A3A4 ], ..., [ A2N-1A2N ],集合 B 包含 M 个区间[ B1B2 ], [ B3B4 ], ..., [ B2M-1B2M ]。求 A - B 的长度。

例如对于 A = {[2, 5], [4, 10], [14, 18]}, B = {[1, 3], [8, 15]}, A - B = {(3, 8), (15, 18]},长度为8。

输入

第一行:包含两个整数 N 和 M (1 ≤ NM ≤ 100000)。

第二行:包含 2N 个整数 A1A2, ..., A2N (1 ≤ Ai ≤ 100000000)。

第三行:包含 2M 个整数 B1B2, ..., B2M (1 ≤= Bi ≤ 100000000)。

输出

一个整数,代表 A - B 的长度。

样例输入
3 2
2 5 4 10 14 18
1 3 8 15
样例输出
8

思路: 给定两个区间数组, 让求A - B区间的长度是多少, 即A区间去掉重合的B区间还剩多少. 因为A和B本身就有重合的, 因此我们需要先对各自区间进行合并, 然后再求出A和B重合的部分, 剩下的A的长度即是我们要的答案.

代码如下:

/*************************************************************************
	> File Name: seg.cpp
	> Author: Maoting Ren
	> Mail: mren@g.clemson.edu
	> Created Time: Sun 22 May 2016 02:29:16 AM EDT
 ************************************************************************/

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

vector<pair<int, int> > merge(vector<pair<int, int> >& nums)
{
    vector<pair<int, int> >  result;
    int len = nums.size(), begin = nums[0].first, end = nums[0].second;
    for(int i =1; i< len; i++)
    {
        if(nums[i].first <= end) end = max(end, nums[i].second); 
        else
        {
            result.push_back(make_pair(begin, end)); 
            begin = nums[i].first;
            end = nums[i].second;
        }  
    }
    result.push_back(make_pair(begin, end)); 
    return result;
}

int main()
{
    int N, M, val1, val2;
    cin>> N >> M;  
    vector<pair<int, int> > A(N), B(M);
    for(int i =0; i< N; i++)
    {
        cin>>val1 >> val2;
        A[i] = make_pair(val1, val2); 
    }
    for(int i =0; i< M; i++)
    {
        cin>>val1 >> val2;
        B[i] = make_pair(val1, val2); 
    }
    sort(A.begin(), A.end()); 
    sort(B.begin(), B.end()); 
    vector<pair<int, int> > vecA = merge(A);
    vector<pair<int, int> > vecB = merge(B);
    int begin, end, ans = 0, k =0, lenA = vecA.size(), lenB = vecB.size();

    for(int i = 0; i < lenA; i++)
    {
        int sum = 0;
        begin = vecA[i].first, end = vecA[i].second;
        while(k < lenB && vecB[k].second <= begin) k++;
        while(k < lenB && vecB[k].second > begin && vecB[k].first < end)
        {
            sum += min(end, vecB[k].second) - max(begin, vecB[k].first); 
            k++;
        }
        if(k >0 && vecB[k-1].second > end) k--;
        ans += end-begin - sum;
    }
    cout << ans << endl;
    return 0;
}







版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hihocoder 1305 区间求差(经典问题)

题目链接区间求差题目分析先来看一个经典问题,给你nn个区间,这些区间共覆盖了多少整点,很显然这些点将整条线段分为2n+12n+1段 那么我们只需要计算每一段是否被覆盖就好了,怎么判断有没有被覆盖...

hihocoder1305(打标记)

链接:点击打开链接 题意:给定两个区间集合 A 和 B,其中集合 A 包含 N 个区间[ A1, A2 ], [ A3, A4 ], ..., [ A2N-1, A2N ],集合 B 包含 M 个区...

HihoCoder 一下 第152周 区间求差

题目1 : 区间求差 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个区间集合 A 和 B,其中集合 A 包含 ...

tarjan模板(缩点,求有向图强连通分量)

整理出了这个tarjan模板,具体数组的功能代码都有注释。 const int N=100010; struct data { int to,next; } tu[N*2]; int head...

hihocoder 1305 区间求差(经典问题)

题目链接区间求差题目分析先来看一个经典问题,给你nn个区间,这些区间共覆盖了多少整点,很显然这些点将整条线段分为2n+12n+1段 那么我们只需要计算每一段是否被覆盖就好了,怎么判断有没有被覆盖...

[hihoCoder] 岛屿 解题报告

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给你一张某一海域卫星照片,你需要统计: 1. 照片中海岛的数目 2. 照片中面积不同的...

[hihoCoder] 非法二进制数 解题报告

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 如果一个二进制数包含连续的两个1,我们就称这个二进制数是非法的。 小Hi想知道在所有 n...

[hihoCoder] 压缩字符串 解题报告

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi希望压缩一个只包含大写字母'A'-'Z'的字符串。他使用的方法是:如果某个子串 S 连续出现了 X 次,...

hihoCoder 1236 Scores 解题报告(bitset + 分段暴力)

#1236 : Scores 时间限制:4000ms 单点时限:4000ms 内存限制:256MB 描述 Kyle is a student of Pro...
  • kbdwo
  • kbdwo
  • 2015年09月23日 18:36
  • 542

hihocoder#1039 解题报告

hihocoder #1039
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[hihoCoder] #1305 : 区间求差 解题报告
举报原因:
原因补充:

(最多只允许输入30个字)