微軟分散式雲端計算框架Orleans(1):Hello World
阿新 • • 發佈:2020-08-17
區間合併:
給定 nn 個區間 [li,ri][li,ri],要求合併所有有交集的區間。
注意如果在端點處相交,也算有交集。
輸出合併完成後的區間個數。
例如:[1,3]和[2,6]可以合併為一個區間[1,6]。
輸入格式
第一行包含整數n。
接下來n行,每行包含兩個整數 l 和 r。
輸出格式
共一行,包含一個整數,表示合併區間完成後的區間個數。
資料範圍
1≤n≤1000001≤n≤100000,
−109≤li≤ri≤109−109≤li≤ri≤109
輸入樣例:
5
1 2
2 4
5 6
7 8
7 9
輸出樣例:
3
將有焦點的區間合併,按照左邊界的大小排序,再依次遍歷判斷即可。
程式碼如下:
1 #include<cstdio> 2 #include<algorithm> 3 #include<vector> 4 using namespace std; 5 typedef pair<int,int> PII; 6 const int N=1e5+10; 7 vector<PII> merge(vector<PII> &v) 8 { 9 int st=-2e9,ed=-2e9; 10 vector<PII>c;11 for(int i=0;i<v.size();i++) 12 if(v[i].first>ed) 13 { 14 if(ed!=-2e9) 15 c.push_back({st,ed}); 16 st=v[i].first; 17 ed=v[i].second; 18 } 19 else ed=max(ed,v[i].second); 20 if(st!=-2e9) c.push_back({st,ed});21 return c; 22 } 23 int main() 24 { 25 vector<PII> v,c; 26 int n; 27 scanf("%d",&n); 28 for(int i=0;i<n;i++) 29 { 30 int l,r; 31 scanf("%d%d",&l,&r); 32 v.push_back({l,r}); 33 } 34 sort(v.begin(),v.end()); 35 c=merge(v); 36 printf("%d\n",c.size()); 37 return 0; 38 }