#1305 : 区间求差
时间限制: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
1 #include"iostream" 2 #include"algorithm" 3 #include"cstring" 4 #define MAX 400001 5 using namespace std; 6 7 8 struct point 9 { 10 int x; 11 int state; 12 }; 13 14 point nn[MAX]; 15 16 bool cmp(point p1, point p2) 17 { 18 return p1.x < p2.x; 19 } 20 21 int main() 22 { 23 int n, m; 24 int start, len=0; 25 int A = 0, B = 0; 26 cin >> n >> m; 27 28 for (int i = 0; i < 2 * n; i += 2) 29 { 30 cin >> nn[i].x; 31 nn[i].state = 0; 32 cin >> nn[i + 1].x; 33 nn[i + 1].state = 1; 34 } 35 36 for (int i = 2*n; i < 2 * (n+m); i += 2) 37 { 38 cin >> nn[i].x; 39 nn[i].state = 2; 40 cin >> nn[i + 1].x; 41 nn[i + 1].state = 3; 42 } 43 44 n = 2 * (n + m); 45 sort(nn, nn + n, cmp); 46 47 for (int i = 0; i<n; i++) 48 { 49 switch (nn[i].state) 50 { 51 case 0: 52 if (!B && !A) 53 start = nn[i].x; 54 A++; 55 break; 56 case 1: 57 A--; 58 if (!B && !A) 59 len += nn[i].x - start; 60 break; 61 case 2: 62 if (A && !B) 63 len += nn[i].x - start; 64 B++; 65 break; 66 case 3: 67 B--; 68 if (A && !B) 69 start = nn[i].x; 70 break; 71 } 72 } 73 74 cout << len; 75 76 return 0; 77 }
时间: 2024-10-14 05:17:55