貪欲
最初の違法位置については、我々は明らかに法律上のポジションを作るために、その範囲をカバーすることで、いくつかを削除したいです
明らかに右の間隔にさらにポイントを削除する権利が優れているので、我々は、削除する優先権ポイント権を考慮して、違法な位置を考えます
$セット$右ポイントでメンテナンスやインターバル数とすることができ
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> の#include <ベクトル> の#include < 設定 > 使用して 名前空間STD。 typedefの長い 長いLL。 インラインint型リード() { int型のx = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '' - ')、F = - 1。CH = GETCHAR()。} 一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。} 戻りのx *のF。 } のconst int型 N = 2E5 + 7 。 INTのN、M。 構造体DAT { int型のR、ID。 DAT(INT _r = 0、INT _id = 0){R = _r、ID = _id。} インラインブール 演算子 <(constの DAT&TMP)のconst { 戻り R!= tmp.r?R <tmp.r:ID < tmp.id。 } }。 ベクター <DAT> V [N]。 ベクトル < int型 > MOV。 セット <DAT> S; INT ()は、メイン { N =読み取る()、M =読み取ります(); INT、B、MX = 0 。 以下のために(int型 i = 1 ; iが<= N; iは++ ) 、A =読み取り()、B = (読み取り)、 MX = MAX(MX、B)、 V [A] .push_back(DAT(B、I))。 int型 ANS = 0 ; 以下のために(int型 I = 1 ; I <= MX; iは++ ) { 一方(S.size()&&(* S.begin())R < I)S.erase(S.begin())。 以下のための(自動X:V [i])とS.insert(DAT(XR、x.id))。 一方、(S.size()> M) { オートP = S.rbegin()。 ANS ++、mov.push_back((* P).ID)。 S.erase( * P); } } のprintf(" %d個の\ n "、ANS)。 以下のための(自動X:MOV)のprintf(" %d個"、X)。プット("" ); リターン 0 ; }