离散化模板 模板 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 void merge (vector<PII> &segs) { vector<PII> res; sort (segs.begin (), segs.end ()); int st = -2e9 , ed = -2e9 ; for (auto seg : segs) if (ed < seg.first) { if (st != -2e9 ) res.push_back ({st, ed}); st = seg.first, ed = seg.second; } else ed = max (ed, seg.second); if (st != -2e9 ) res.push_back ({st, ed}); segs = res; }
题目描述: 给定 n 个区间 [li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。输入格式 第一行包含整数 n。
接下来 n 行,每行包含两个整数 l 和 r。
输出格式 共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围 1≤n≤100000, −10^9≤li≤ri≤10^9
输入样例: 5 1 2 2 4 5 6 7 8 7 9
输出样例: 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <iostream> #include <vector> #include <algorithm> using namespace std;typedef pair<int , int > PII;void merge (vector<PII> &segs) { vector<PII> res; sort (segs.begin (), segs.end ()); int st = -2e9 , ed = -2e9 ; for (auto seg : segs) if (ed < seg.first){ if (st != -2e9 ) res.push_back ({st, ed}); st = seg.first, ed = seg.second; } else ed = max (ed,seg.second); if (st != -2e9 ) res.push_back ({st, ed}); segs = res; } int main () { int n; scanf ("%d" ,&n); vector<PII> segs; for (int i = 0 ; i < n; i++){ int l, r; scanf ("%d%d" ,&l,&r); segs.push_back ({l,r}); } merge (segs); cout << segs.size () << endl; return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 #include <stdio.h> #define N 100010 typedef struct { int left; int right; }pai; pai segs[N]; int n;void sort (int l, int r) { pai a[N]; if (l==r) return ; int mid = (l+r)/2 ; sort(l, mid), sort(mid+1 , r); int k=0 , i=l, j=mid+1 ; while (i <= mid && j <= r){ if (segs[i].left <= segs[j].left) a[k++] = segs[i++]; else a[k++] = segs[j++]; } while (i <= mid) a[k++] = segs[i++]; while (j <= r) a[k++] = segs[j++]; for (i=l,j=0 ; i <= r; i++,j++) segs[i] = a[j]; } int merge () { sort(1 ,n); int i=1 , j=2 , k=0 ; while (i<=n){ if (segs[i].right >= segs[j].left && j<=n){ if (segs[i].right <= segs[j].right){ segs[i].right = segs[j].right; } j++; }else { k++; i = j; j++; } } return k; } int main () { scanf ("%d" ,&n); int i; for (i=1 ; i <= n; i++) scanf ("%d %d" ,&segs[i].left, &segs[i].right); printf ("%d\n" ,merge()); }
版权声明: 此文章版权由chen-yisen所有,如有转载,请注明明來自原作者