計蒜客 藍橋杯模擬二 區間合併 打掃教室

 
 
 

一天蒜頭君被要求打掃 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^31n,m103。spa

對於 100\%100% 的數據:1 \le n,m \le 10^6, 1 \le l \le r \le n1n,m106,1lrn。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;
}

  也能夠求前綴和設計

相關文章
相關標籤/搜索