フェイス質問
$ Zhhx $は、ホールの定理を拡張し、話題について話しました。
問題の解決策
$ rがより裕福詳細$ので、この操作は、我々はの先頭になるよう、左に、達成するために、ツリーラインを使用し、その最も過酷$ [r..n] $を見つけ、$ [1..l] $の範囲を考えてみましょう時間が減少等差数列の形式です。
セグメントツリーは、最小間隔で変更されます。
コード$ WAは、いくつかのポイントを$、それは鍋のビットでなければなりません。見て兄がある場合はアウトワット何かを言うことを忘れないでください。
書式#include <cstdioを> する#include <iostreamの> の#include <アルゴリズム> 書式#include <CStringの> に#define N 200050 の#define INTレジスタ里 の#define INF 10000007を使用して名前空間はstdを、INTのN、M。 構造体ノード{ int型のL、R。 ブール演算子 <(constのノード&RHS)のconst { 戻り L < rhs.l。 } } [N]。INT B [N]。構造体segment_tree { int型 TT [N << 2 ]、タグ[N << 2 ]。 ボイド maketree(int型のx、int型 LB、INT RB){ 場合(LB == RB){ TT [X] = B [LB]。 タグ[X] = 0 ; 返します。 } INT半ば=(LB + RB)/ 2 。 maketree(2 * X、ポンド、半ば)。maketree(2 * X + 1、中間+ 1 、RB)。 TT [X] =分(TT [ 2 * x]は、TT [ 2 * X + 1 ])。 } 無効プッシュダウン(INT X){ int型 K =タグ[X]。タグ[X] = 0 ; TT [ 2 * X] + = K。タグ[ 2 * X] + = K。 TT [ 2 * X + 1 ] + = K。タグ[ 2 * X + 1 ] + = K。 } ボイド追加(int型のx、int型の L、int型の R、int型 K、INT LB、INT RB){ 場合(L <=ポンド&& RB <= R){ TT [X] + = K。タグ[X] + = K。 返します。 } 場合(LB> R || RB <L)のリターン; プッシュダウン(X)。 INT半ば=(LB + RB)/ 2 。 追加(2 * X、L、R、K、LB、MID)。追加(2 * X + 1、L、R、K、ミッド+ 1 、RB)。 TT [X] =分(TT [ 2 * x]は、TT [ 2 * X + 1 ])。 } INTクエリ(int型のx、int型の L、INT R、INT LB、INT RB){ 場合(L <=ポンド&& RB <= R){ リターンTT [X]。 } 場合(LB> R || RB <L)戻りINF。 プッシュダウン(X)。 INT半ば=(LB + RB)/ 2 。 戻り分(クエリ(2 * X、L、R、LB、MID)、クエリ(2 * X + 1、L、R、中間+ 1 、RB))。 } } YY。 INT メイン(){ scanf関数(" %dの%のD "、&M、&N) 用(RI I = 1のscanf(; I <= M iは++)" %d個の%のD "、および[I] .L、&[I] .R)。 ソート(A + 1、+のM + 1 )。 int型の CNT = 0; 用(RI I = N + 1 ; I> = 1 ; i--)[i]は= CNT ++ B 。 yy.maketree(1、1、N + 1 )。 int型 ANS = 0 ; 用(RI i = 1 ; I <= M; iは++ ){ yy.add(1、1、[I] .R、 - 1、1、N + 1 )。 INT明= yy.query(1、[I] .L + 1、N + 1、1、N + 1 )。 もし([I] .L +明<ANS)ANS = [I] .L +明; } のprintf(" %d個の\ n "、 - ANS)。 }