学校の外の木
タイトル説明
並木道路のゲート長L外部学校、隣り合う木の間隔は1メートルです。我々は、シャフトとしてのシャフトの位置番号0、もう一方の端の位置Lにおける道路の一端道路番号を置くことができ、各整数軸点、すなわち、0,1,2、...、\(Lの\)を、あります樹種があります。
地下鉄を構築するために使用する道路上のいくつかの分野がありますので。これらの領域は、その数の軸と開始点と終了点を表します。任意の既知の開始座標及び領域の終了点が整数である、部分領域間の重なりがあってもよいです。さて、(端部領域において、2つのツリーを含む)我々これらの地域の木を除去しました。あなたの仕事は、これらの木の計算は、道路上にあるどのように多くの木々 、削除されています。
入力フォーマット:
最初の行は二つの整数有する\(L(1 <= L <= 100000)\) と\(M(1 <= M <= 100000)\)、\ (Lの\)道路の長さの代表的な、\(Mを\)領域の数を表し、\(Lの\)と\(M \)の間の空間によって分離します。次\(M \)行は、開始を示す地域の点を終了座標、空間によって分離された2つの異なる整数を含んでいます。
出力フォーマット:
これは、道路上の残りの木の数を表す整数のみを含む行を含みます。
サンプル入力:
500 3 150 300 100 200 470 471
出力例:
298
データ範囲:
データの20%を、部分領域間に重複はありません。
他のデータのために、領域間の重複があります。
制限時間:
1S
スペースの制限:
256M
問題の解決策
学校の木、emmm、ほとんど差は非常にしかし、それに慣れて、ロスバレーの話題以外では、データの範囲であることに注意してください\(L(1 <= L <= 100000)\)、\ (M(1 <= M <= 100000)\) 、そこに使用することはできませんので\(NM \)この質問の上に暴力を。
つまり、間隔が要件の番号の後に、変更、修正、件名を見てください。
限り、我々はインターバル時間の複雑さを変更するように一度だけ、加算、うまく下がります。
1つの操作のみがあるので、私たちは違いを使用することができます。
我々は、アレイを設定する(S \)\、2つの数の各入力\(Lの\)と\(R&LTの\)我々は聞かせて、(\ ++ S [L])\ \、(S [R&LT + 1] - - \) 。
我々はポイントをプレフィックスとポイントがカバーされている回数を示すことができます。
もちろん、ここにいるかどうかだけに限り、私たちの最後のスイープとして再び0から、関係なく、番号とカバレッジの、カバーする\(Lの\)プレフィックス内及び数は、その上に0の数です。
アルゴリズムの時間計算量がある\(O(L + M)\) 。
コードの場合:
#include<bits/stdc++.h>
using namespace std;
int len,m;
int l,r;
int ans;
int s[100009];
int sum;
int main(){
scanf("%d%d",&len,&m);
for(int j=1;j<=m;j++){
scanf("%d%d",&l,&r);
s[l]++;
s[r+1]--;
}
for(int j=0;j<=len;j++){
sum+=s[j];
if(sum==0) ans++;
}
printf("%d",ans);
return 0;
}