3.線段覆蓋長度
題解
因為線段具有疊加性,所以我們可以把線段進行merge,當一個線段的開頭跟另一個線段的結尾有部分重疊時,我們就把兩線段合併,合併後的線段開頭會是index比較小的兩線段開頭,線段結尾會是index比較大的兩線段尾部
當兩線(大線段與新線段)段並無重疊點,那令新讀入的線段為新的大線段,並且把舊的大線段的長度加進去答案
在成立以上條件前,我們要先對輸入排序,免得無法精確計算重複部分
注意:我們在輸出時要再計算一次舊線段長度,否則會漏掉一段線段
AC Code
python
from sys import stdin
n=int(stdin.readline().strip())
data=sorted([list(map(int,stdin.readline().strip().split())) for _ in range(n)])
temp=data[0]
total=0
for i in data:
if i[0]<=temp[1]:
temp[0]=min(temp[0],i[0])
temp[1]=max(temp[1],i[1])
else:
total+=temp[1]-temp[0]
temp=i
print(total+temp[1]-temp[0])
C++
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
vector<vector<int>> data(n);
for(int i=0;i<n;i++){
int x,y;cin>>x>>y;
data[i].push_back(x);
data[i].push_back(y);
}
sort(data.begin(),data.end());
vector<int> temp=data[0];
long long total=0;
for(int i=0;i<n;i++){
if(data[i][0]<=temp[1]){
temp[0]=min(temp[0],data[i][0]);
temp[1]=max(temp[1],data[i][1]);
}
else{
total+=(temp[1]-temp[0]);
temp=data[i];
}
}
cout<<total+temp[1]-temp[0]<<endl;
}