[hihoCoder] #1305 : 区间求差 解题报告
来源:互联网 发布:blast算法 编辑:程序博客网 时间:2024/05/16 14:40
题目链接: http://hihocoder.com/problemset/problem/1305
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
- 样例输入
3 22 5 4 10 14 181 3 8 15
- 样例输出
8
描述
给定两个区间集合 A 和 B,其中集合 A 包含 N 个区间[ A1, A2 ], [ A3, A4 ], ..., [ A2N-1, A2N ],集合 B 包含 M 个区间[ B1, B2 ], [ B3, B4 ], ..., [ B2M-1, B2M ]。求 A - B 的长度。
例如对于 A = {[2, 5], [4, 10], [14, 18]}, B = {[1, 3], [8, 15]}, A - B = {(3, 8), (15, 18]},长度为8。
输入
第一行:包含两个整数 N 和 M (1 ≤ N, M ≤ 100000)。
第二行:包含 2N 个整数 A1, A2, ..., A2N (1 ≤ Ai ≤ 100000000)。
第三行:包含 2M 个整数 B1, B2, ..., B2M (1 ≤= Bi ≤ 100000000)。
输出
一个整数,代表 A - B 的长度。
思路: 给定两个区间数组, 让求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;}
0 0
- [hihoCoder] #1305 : 区间求差 解题报告
- hihocoder 1305 区间求差
- 区间求差 hihocoder 1305
- hihocoder 1305 区间求差(经典问题)
- hihocoder 1305 区间求差 经典思维+技巧
- HihoCoder 一下 第152周 区间求差
- hihocoder#1039 解题报告
- [hihoCoder] 岛屿 解题报告
- hiho1305区间求差
- 区间求差
- hihoCoder挑战赛20解题报告
- [hihoCoder] #1306 : 股票价格 解题报告
- [hihoCoder] 任务分配 解题报告
- [hihoCoder] 二进制小数 解题报告
- [hihoCoder] 区域周长 解题报告
- [hihoCoder] 压缩字符串 解题报告
- 152周 区间求差
- POJ1089解题报告 区间合并
- angularJs中directive的scope ‘@’,‘=’区别
- java WebSocket 简易聊天消息推送
- 【iOS开发】自定义UIView边框的颜色
- CentOS6.2下配置KeepLived + LVS
- 分治法
- [hihoCoder] #1305 : 区间求差 解题报告
- 多文件上传,使用js对文件进行校验,包括文件单个大小,格式,总的文件大小,文件是否为空等
- LeetCode:Multiply Strings
- vs2010调用ffmpeg的avcodec.lib崩溃的解决方案
- Sed命令的基本使用
- Java多线程中join方法的理解
- Chrome浏览器,搜索JS方法。
- Android小知识——关于Android内存、性能优化的一些细节
- vi查找行开头结尾