間隔のセットと、正の整数$がI $ $ K $を考えると、$ Iが計算$最大再$ kは$長間隔セット。
離散間隔$ [1,2n]を構成する$、$ S $と$ 1 $接続側$(K、0)$、$ iが$と$ I + 1接続$側$(K、0)$、$ 2N $エッジ$(K、0)$に接続$ Tの$(1、LR)$各ビン$(L、R)$、$ Lが$およびR&LT $ $ $接続されたエッジのために。
最大長に反対数の最小コスト
書式#include <iostreamの> の#include <sstream提供> する#include <アルゴリズム> 書式#include <cstdioを> する#include <math.h>の 書式#include <設定> 書式#include <マップ> 書式#include <キュー> の#include <string>に する#include < string.hの> の#include <ビットセット> の#include <unordered_map> の#define REP(I、N)のために(INT iは=; I <= N; ++ I) の#define PER(I、N) - (I; I> = A I = N INT)のため の#defineのHRのputchar(10) の#define PB一back の#define LC(O << 1) (| 1 LC)の#define RC の#define中間((L + R)>> 1) の#define LSのLC、L、中 の#define RSのRC、ミッド+ 1、R の#define X最初 の#define yの第二 の#define IOのstd :: IOS :: sync_with_stdio(偽) の#define ENDL '\ n'は #define DB(A)({REP(__ I、1、n)はCOUT << [__ I] <<」「;}時間) 名前空間stdを使用。 typedefの長い長いLL。 typedefのペア<int型、int型> PII。 CONST int型P = 1E9 + 7、P2 = 998244353、INF = 0x3f3f3f3f。 LLのGCD(-1,11,11- b)は{戻りB GCD(B、%のB):;} のLL qpow(-1,11,11- n)で{LLのR = 1%P;(%= Pのために、N ; = *%P、N >> = 1)であれば(N - 1)R = R *%のP、リターンR;} ?LL INV(LL X){X <= 1を返す:INV(P%以下X)*(PP / X)%P;} インラインint型RD(){int型のx = 0; CHAR P = GETCHAR();一方、(P < '0' || P> '9')p = GETCHAR() ;一方、(P> = '0' && P <= '9')、X = X * 10 + P-'0' 、P = GETCHAR();戻りX;} //ヘッド ONLINE_JUDGE用の#ifdef のconst int型N = 1E6 + 10; #else のconst int型N = 999。 #endifの};に、F、W。 ベクトル<_> E; ベクター<INT> G [N]。 構造体_ {から、F、W、にINT;}; D [e.to] = D [X] + EF。 INT [N]、プリ[N]、INQ [N]、D [N]。 int型MF、MC。 キュー<整数> Q; ボイド追加(int型のx、int型のY、int型C、INT W){ G [X] .pb(E.size())。 E.pb({X、Y、C、W})。 G [Y] .pb(E.size())。 E.pb({Y、X、0、-w})。 } ボイドMFMC(){ MF = MC = 0。 (1){一方 REP(I、1、T)[i]は= Dの[I] = INF、INQ [I] = 0; q.push(S)、D [S] = 0; 一方、{(q.empty()!) INT X = q.front()。q.pop(); [X] INQ = 0。 以下のための(自動T:G [X]){ オートE = E [T]。 IF(EW> 0 && D [e.to]> D [X] + EF){ 事前[e.to] = T。 【e.to] =分([X]、EW)。 もし{(INQ [e.to]!)[e.to] = 1 INQ。 q.push(e.to)。 } } } } もし([T] == INF)ブレーク。 (INT U = T; U = S;!Uは= E [U]は[事前]から。)のために{ E [プレ[U] W- = A [T]。 E [プレ[U] ^ 1] .W + = [T]。 } MF + = [T]、MC + = [T] * D [T]。 } } int型B [N]、L [N]、R [N]。 INTメイン(){ scanf関数( "%d個の%のD"、&N&K)。 REP(I、1、N){ scanf関数( "%d個の%のD"、L + I、R + I)。 B [++ * B] = 1 [I]、B [++ * B] = R [i]は、 } ソート(B + 1、B + 1 + * B)、* B =一意(B + 1、B + 1 + * B)-b-1。 REP(I、1、N){ L [I] = LOWER_BOUND(B + 1、B + 1 + * B、L [I]) - B。 R [I] = LOWER_BOUND(B + 1、B + 1件の+ * B、R [I]) - B。 } S = * B + 1、T = Sを+ 1。 (S、1、K、0)を追加し、(* B、T、K、0)を加えます。 REP(I、2、* B)(I-1、I、K、0)を加えます。 REP(I、1、N)(L [i]は、R [i]は、1、-B [R [I] + B [L [I])を追加します。 MFMC(); printf( "%d個の\ n"、-mc)。 }