(と言って、そのような練習は最近...ああをたくさん書きました)
簡素化:数直線上の一連の点を与えられたが、一緒に取得する場合のポイントは、お互いにぶつかることができない、正の方向に移動し、彼らはすべての条件は、衝突のポイントではありません満足しようとする行数を、別のラインを配置する必要があります。
(誤解ラベル、いつもの半分の答えを考えます...)
この質問は難しいことではありません。まず第一に、その答えは、衝突の最大のポイントということでなければなりません。(オープンチャネルを共有することができます)
次に、この質問は、より明確です。私はその頭の上にスタック内の時刻tにおける点までその背後にあるポイントを探しています。
それはそれの終わりまでの距離以上のものです。
この関係は、ああ、右.....少し逆おなじみのようなものです。。。それとも、...逆転またはしようとしているのポイント...もないシーケンス(ドットが最後まで追求)(興亡のに関わらず)、最長の?
それは....私たちのLOWER_BOUNDプレイを持っていてください。(各点* -1、最大需要以下)
しかし、我々は多くのポイントWA ....間違っていました。
振り返ってみると、大きなアイデアは何の問題、詳しく説明しなければならない問題になりません。
境界線を圧延するので、LOWER_BOUND等号が犯人である、最長のサブシーケンスは上昇しないことが判明し...
だから、UPPER_BOUNDラインああに変更。。。
だから、常に(貪欲)の更新、あなたは答えを見つけることができます。
コード:
#include <ビット/ STDC ++ H>
使用して 名前空間STDを、
#defineは長い長いっ
のconst int型 MAXN = 1E6 + 10 。
構造体ノード
{
LLのX、V、ST、ED。
} [MAXN]。
LL Q [MAXN]。
LL N、T。
TOT LL;
INT メイン()
{
scanf関数(" %のLLDの%のLLD "、&N、&T)。
以下のために(int型 i = 1 ; iが++; iが<= N )
{
LLのX、Y。
scanf関数(" %のLLDの%のLLD "、およびX&Y)。
[I] .ST
}= X。
[I] .ED = X + Yの*のT。
}
Q [ ++ TOT] = - [ 1 ] .ED。
以下のために(int型 I = 2 ; iが<= N; iは++ )
{
LL X = - [I] .ED。
もし(x> = Q [TOT])
{
Q [ ++ TOT =のX。
}
他
{
int型 K = UPPER_BOUND(Q + 1、Q + TOT + 1、X) - Q。
Q [K] =のX。
}
printf(" %のLLD " 、TOT)。
リターン 0 ;
}
(終わり)