1.大量の注文に小さなの終わり:間隔を選択し、間隔選択のポイント
例(インターバル選択された点)バレー1250ロス木
書式#include <iostreamの> の#include <cstdioを> 使用して 名前空間はstdを、 構造体strage { INT KW。 int型JW; int型のトン。 } [ 30001 ]、TEMP。 INT のmain(){ int型 N、H、I、J、K、和= 0 。 int型 ZA [ 30001 ] = { 0 }。 scanf関数(" %d個の%のD "、&N、&H)。 用(i = 1 ; iは= Hを<; iは++ ) のscanf(" %D%D%D "、および[I] .kw、&[I] .jw、&[I] .T)。 用(i = 1 iが++; iは時間< ) ため(J = I + 1 ; J <= hのJ ++ ) 場合([i]が.jw> [J] .jw){TEMP = [I]。 [J] = [i]は[J] = }; TEMPを するための(i = 1 ; iが<= hの; iは++ ) { ため(J =〔I〕.kwあり、j <= [I] .jw; J ++ ) 場合(ZA [J] == 1)[I] .t-- 。 K = [I] .T。 もし(K> 0 ){ ため(J =〔I〕.jw; J> = [I] .kw; j-- ) 場合(ZA [J] == 0 ) { ZA [J] = 1 。 K - ; もし(K == 0)ブレーク。 } } } のために(i = 1 ; iが<= N; iは++)場合(ZA [I] == 1)合計++ 。 printf(" %dの" 、合計)。 リターン 0 ; }
小規模から大規模まで2.初め:インターバルカバレッジ
3.あなたは貪欲に戻ることができます
方法:1.シミュレーション二重にリンクされたリストを構築(前と記録後)
2.優先キューから取り出し点は、約2マークは、更新二重リンクリストを訪問し、右、右+左ポイント右のポイントとき - 右のチームに現在のポイント
例P1792
// luogu-判定部有効-O2 の#include <iostreamの> の#include <cstdioを> する#include <キュー> の#include <CStringの> に#define N 200007 使用して 名前空間はstdを、 構造体TU { int型のVal、L、R。 } P [N]。 構造体ノード { int型のVal、POS。 ブール 演算子 <(constのノード&X)のconst { 戻りヴァルを< x.val。 } }。 INTのN、M、ANS。 BOOL VIS [N]。 PRIORITY_QUEUE<ノード> Q。 ボイド DUI(INT X) { P [X] .L = P [P [X] .L] .L。 P [X] .R = P [P [X] .R] .R。 P [P [X] .L] .R =のX。 P [P [X] .R] .L =のX。 } int型のmain() { scanf関数(" %D%dの"、&N、&M)。 もし(N <M * 2 ) { のprintf(" エラー!" )。 リターン 0 ; } のための(INT I = 1; ++; iが<= N )I { scanf関数(" %のD "、および[I] .val)P。 P [i]は.L = I- 1 。 P [I]。R = I + 1 。 q.push((ノード){P [i]は.val、I})。 } P [ 1 ] .L = N、P [N] .R = 1 。 以下のために(int型 I = 1 ; I <= M; ++ I) { 一方(VIS [q.top()POS]) q.pop(); ノード今 = q.top()。 q.pop(); ANS + = now.val。 VIS [P [now.pos] .L] = VIS [P [now.pos] .R] = 1 。 P [now.pos] .val = P [P [now.pos] .L] .val + pを[P [now.pos] .R] .val- P [now.pos] .val。 q.push((ノード){P [now.pos] .val、now.pos})。 DUI(now.pos)。 } のprintf(" %dの" 、ANS)。 リターン 0 ; }
それとも、それを古典的な質問のほんの数よりも貪欲な戦略をプッシュします