一天蒜頭君被要求打掃 nn 間連續的教室(編號從 11 到 nn),可是蒜頭君打掃教室有點隨心,想打掃哪間教室就打掃哪間教室,致使最後本身都不知道是否全部的教室都打掃了。html
如今告訴你蒜頭君打掃了哪些教室,你能告訴蒜頭君他還有多少間教室沒有打掃嗎?node
第一行輸入兩個整數 n,mn,m,分別表示教室的個數和蒜頭君打掃教室區間段的個數。ios
接下來 mm 行,每行有兩個整數 l,rl,r,表示蒜頭君打掃了 [l,r][l,r] 區間的教室。ide
輸出一個整數,表示蒜頭君還有多少間教室沒有打掃。ui
對於 50\%50% 的數據:1 \le n, m \le 10^31≤n,m≤103。spa
對於 100\%100% 的數據:1 \le n,m \le 10^6, 1 \le l \le r \le n1≤n,m≤106,1≤l≤r≤n。debug
10 3 1 5 3 7 9 10
1
題解:
先將區間進行排序,排序後的區間只有相交和不相交兩種。當前右邊端點大於後面的左邊端點時則兩個區間相交,不然不相交
而後用總數減去每一個相交區間所含個數獲得結果
#include <map> #include <set> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <vector> #include <string> #include <bitset> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> #define ls (r<<1) #define rs (r<<1|1) #define debug(a) cout << #a << " " << a << endl using namespace std; typedef long long ll; const ll maxn = 1e6+10; const ll mod = 10086; const double pi = acos(-1.0); const double eps = 1e-8; struct node { ll le, ri; }; node a[maxn]; bool cmp( node p, node q ) { if( p.le == q.le ) { return p.ri < q.ri; } return p.le < q.le; } int main() { ll n, m; scanf("%lld%lld",&n,&m); for( ll i = 0; i < m; i ++ ) { scanf("%lld%lld",&a[i].le,&a[i].ri); } sort(a,a+m,cmp); ll le = a[0].le, ri = a[0].ri; for( ll i = 1; i < m; i ++ ) { if( ri >= a[i].le ) { le = min(le,a[i].le); ri = max(ri,a[i].ri); } else { n = n - (ri-le+1); le = a[i].le; ri = a[i].ri; } } n = n - (ri-le+1); printf("%lld\n",n); return 0; }
也能夠求前綴和設計