[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 区间求差

You are given two interval collections A and B. Collection A has N intervals [ A1, A2 ], [ A3, A4 ],...
  • wybooooooooo
  • wybooooooooo
  • 2017年10月17日 20:09
  • 39

区间求差 hihocoder 1305

题目大意:给定 A B两个区间,求在A区间不在B区间的线段长度 这个题一开始的时候想用线段树做,但是耗内存太多了,后来发现 我们对一个区间标记他的左右端点,遇到左端点+1,遇到右端点-1,这就...
  • becky_w
  • becky_w
  • 2017年10月21日 21:11
  • 46

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

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

hihocoder 1305 区间求差 经典思维+技巧

题目链接 题意:  给你两个区间的集合,A和B,让你求A-B的差的和为多大. 思路: 以下来自hihocoder讨论区大神的分析: 《区间求差》题目分析 这道题是一类区间问题的变体,我们先来...
  • HowardEmily
  • HowardEmily
  • 2017年06月04日 16:57
  • 193

HihoCoder 一下 第152周 区间求差

题目1 : 区间求差 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个区间集合 A 和 B,其中集合 A 包含 ...
  • leibniz_zhang
  • leibniz_zhang
  • 2017年06月03日 14:09
  • 136

区间求差

给定N个区间[S1, E1], [S2, E2], ... [SN, EN],求这些区间并集的长度。 这道题通常的解法是,我们把这N个区间的2N个端点从左到右排列在数轴上P1, P2, ... ...
  • qq_34472372
  • qq_34472372
  • 2017年06月19日 12:04
  • 86

HihoCoder ——1305

hihocoder 1305题解|A+B| = |A| + |B| - |AB||A-B| = |A| - |AB|求出A,B,A+B 的实际长度,再用逻辑运算即可! AC code#inclu...
  • Tawn0000
  • Tawn0000
  • 2017年10月16日 21:52
  • 77

152周 区间求差

这道题是一类区间问题的变体,我们先来看一道最基础的区间问题: 给定N个区间[S1, E1], [S2, E2], ... [SN, EN],求这些区间并集的长度。 这道题通常的解法是,我们...
  • yusiningxin
  • yusiningxin
  • 2017年06月01日 20:03
  • 82

hiho1305区间求差

#1305 : 区间求差 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个区间集合 A 和 B,其中集合 A 包含 N 个区间[ A1, A2...
  • xishisugan
  • xishisugan
  • 2017年05月29日 20:58
  • 325

Mysql主从复制报错Last_Errno: 1305

Mysql主从复制某些库表时总出现各种问题,之前根据业务配置的只张同步的表如下(作用同replicate_do_table): replicate_wild_do_table=me.parana_b...
  • u010587433
  • u010587433
  • 2015年10月22日 22:43
  • 1711
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[hihoCoder] #1305 : 区间求差 解题报告
举报原因:
原因补充:

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