https://www.luogu.org/problem/P1309
私はおそらくZZを持っていると思うし、タイトルの人気は不快、問題への解決策を確認しなければならないのではないでしょう。
の$ O(rnlogn)$があまりにも確認することはできません(意味無し後)
確かにシーケンスを降りてくることができます複雑さはパターンがあります。
だから、常にアッパーブラケットと下側ブラケット自分の単調減少を見つけることができます。
次に、2つのアッパーブラケットとラインの下側ブラケットの合併を命じ、ほとんどソートマージ置きます。
私のIQは、風にキャンドルを持っています。
#include <地図> の#include <cmath> の#include <キュー> の#include <cstdioを> する#include <ベクトル> の#include <CStringの> する#include <iostreamの> する#include <アルゴリズム> 使用して 名前空間STD。 typedefの長い 長いLL。 CONSTの INT N = 2E5 + 5 。 インラインint型リード(){ int型 X = 0、W = 0。CHAR CH = 0 。 しばらく(!isdigit(CH)){W | = CH == " -' ; CH = GETCHAR();} ながら(isdigit(CH))X =(X << 3)+(X << 1)+(CH ^ 48)、CH = GETCHAR()。 リターン?W - X:X; } 構造体人{ int型の、ID、W。 } [N]、B [N]、[N] C。 int型、N、R、Q。 BOOL CMP(人Xと人Y){ 場合(XSは== YS)を返す x.id < y.id。 返す XS> YSを。 } ボイドmsort(){ ため(int型 I = 1、J = 1 ; I <=2 * N; I + = 2、J ++ ){ 場合([i]は.W> [I + 1 ] .W){ B [j]は [I] =; B [j]は++ .S 。 C [j]は = [I + 1 ]。 } 他{ B [j]は [I + = 1 ]、B [j]は++ .S 。 C [j]は = [I]を、 } } のための(int型 I = 1、J = 1、K = 1 ; iが= < 2 iが++; * N ){ もし(j <= N &&(K> N ||(B [j]は.S> C [k]は||(B [j]は.S == C .S [k]は&& B [J] .ID <C .S K] .ID))))[I] = bの[J ++ ]。 他 [I] = Cを[K ++ ]。 } } INT {main()の N =(読み取り); R =リード(); Q = 読み取り()。 以下のために(int型 i = 1 ; iが<= 2 * N; I ++ ){ [i]は.Sの =は、READ(); [I] .ID = iは、 } のために(int型 i = 1 ; iが<= 2 * N; I ++)[I] .W。= READ(); ソート(A + 1、A + 2 * N +1 、CMP)。 以下のために(int型 I = 1 ; I <= R; iは++ ){ msort()。 } のprintf(" %dの" 、[Q] .ID)。 リターン 0 ; }
+++++++++++++++++++++++++++++++++++++++++++
+著者:luyouqi233。+
+私のブログへようこそ:http://www.cnblogs.com/luyouqi233/ +
+++++++++++++++++++++++++++++++++++++++++++