题目1 : 区间求差
时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
描述
给定两个区间集合 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 的长度。
3 2 2 5 4 10 14 18 1 3 8 15样例输出
8
先对A,B 化简 -- 然后求交即可。
扫描二维码关注公众号,回复:
1522097 查看本文章
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node{ int x,y; }A[5][100100]; bool cmp(node x,node y){ return x.x<y.x; } int n,m,n1,m1; int ss() { sort(A[1]+1,A[1]+1+n,cmp); sort(A[2]+1,A[2]+1+m,cmp); n1=m1=0; int ans=0; int i=1,x,y; while (i<=n) { x=A[1][i].x; y=A[1][i].y; i++; while (i<=n&&A[1][i].x<=y){ y=max(y,A[1][i].y); i++; } n1++; A[3][n1].x=x; A[3][n1].y=y; ans+=y-x; } i=1; while (i<=m) { x=A[2][i].x; y=A[2][i].y; i++; while (i<=m&&A[2][i].x<=y){ y=max(y,A[2][i].y); i++; } m1++; A[4][m1].x=x; A[4][m1].y=y; } return ans; } int sp(int i,int j){ return max(0,min(A[3][i].y,A[4][j].y)-max(A[3][i].x,A[4][j].x)); } int ans(){ int ans=0; int i,j; i=j=1; while (i<=n1&&j<=m1){ ans+=sp(i,j); if (A[3][i].y>A[4][j].y) j++; else if (A[3][i].y<A[4][j].y) i++; else i++,j++; } return ans; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d%d",&A[1][i].x,&A[1][i].y); for (int i=1;i<=m;i++) scanf("%d%d",&A[2][i].x,&A[2][i].y); printf("%d\n",ss()-ans()); return 0; }