P4873 [USACO14DEC]牛Jog_Gold牛は(ファック?ハーフ?)をジョギング

(と言って、そのような練習は最近...ああをたくさん書きました)

 

簡素化:数直線上の一連の点を与えられたが、一緒に取得する場合のポイントは、お互いにぶつかることができない、正の方向に移動し、彼らはすべての条件は、衝突のポイントではありません満足しようとする行数を、別のラインを配置する必要があります。

(誤解ラベル、いつもの半分の答えを考えます...)

この質問は難しいことではありません。まず第一に、その答えは、衝突の最大のポイントということでなければなりません。(オープンチャネルを共有することができます)

次に、この質問は、より明確です。私はその頭の上にスタック内の時刻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 ; 
}

(終わり)

おすすめ

転載: www.cnblogs.com/ajmddzp/p/11774762.html