そこN牛の放牧ストール。
同じ期間における各失速は、牛の放牧に提供することができ、それは、複数の囲いを必要とするかもしれません。
牛牛あたりNは、開始時間Aと時間Bの斜端を放牧与えられ、この期間の[A、B]内のそれぞれの牛が放牧されているであろう。
(含む)の間隔を放牧2頭の交差点がある場合には、牛の2つのヘッドが同じ囲い放牧に配置することができません。
各動物の失速に対応する最小数を求めて、プログラムのニーズを失速。
入力形式の
1行目:入力整数N.
最初2..n + +1:ライン+ I 1の数字の間の空間によって分離されたi番目の放牧放牧牛と終了時刻Bの行入力開始時刻。
出力形式の
1行目:入力屋台の最低限必要な数を表す整数。
最初2..n +1:ライン+ I 1〜I-ライン入力囲い牛であれば、プログラムが正当であることができるように、1から始まる番号の中に入れました。
データ範囲
1 ≤N≤ 50000 、
1 ≤A、B≦ 1000000
サンプル入力:
5 1 10 2 4 3 6 5 8 4 7
出力例:
4 1 2 3 2 4
主な問題は、知識ポイント範囲のパケットを調べることです
関連の知識ポイントを参照してください。https://www.cnblogs.com/myhnb/p/11243677.html
ACコード
#include <ビット/ STDC ++ H>
名前空間STDを使用して、
typedefのペア<int型、int型> PII。
CONST int型N = 5 * 1E4 + 10。
PRIORITY_QUEUE <PII、ベクトル<PII>、大きな<PII>> G。
対<ペア<整数、整数>、整数> P [N]。
INT D [N]。
int型nは、CNT;
INTメイン()
{
scanf関数( "%のD"、&N);
以下のために(INT i = 1; iが<= N; iは++)
{
P [i]は.second = I。
scanf関数( "%dの%のD"、&P [i]は.first.first、&P [i]の.first.second)。
}
ソート(P + 1、P + N + 1)。
CNT = 1。
g.push(make_pair(P [1] .first.second、1))。
D [P [1] .second] = 1。
(私は++; iが<= N I = 2の整数)のための
{
IF(P [i]が.first.first <= G。
g.push(make_pair(P [i]の.first.second、++ CNT))。
D [P [i]は.second] = CNT。
}
他
{
= g.top(今INT)まず、Z = g.top()は、第2の。。。
g.pop();
今= MAX(今、P [i]の.first.second)。
g.push(make_pair(ここで、Z))。
D [P [i]は.second] = Z;
}
}
のprintf( "%d個の\ n"、g.size())。
以下のために(INT i = 1; iが<= N; iは++)のprintf( "%Dを\ n"、Dを[I])。
0を返します。
}