$ Noip2011 / Luogu1314 $賢い品質監督進接頭辞と巧妙な+

$ Luogu $

 

$ソル$

まず、それは$ $ w_i $ W $でなければなりません。そして、それは暴力への道を出てきた、と$ Wの$の再計算を列挙します。

彼は1つがS $最小の$ Yの$ <Y $ $ Aが$であるS $最大> $であり、2つだけであるY $の最小絶対値のSY $ $ $を満たすことに留意すなわち彼らは、一対を求めている。$ W $を二分するときに値を求めていた。しかし、$のチェック$複雑さはまだ$ O(NM)を見て$ですので、これは、この問題を$アウト$はありません説明が$ $接頭辞を発見し、アクリジンを確認することができた後、私は非常に巧妙な$のqwq $を感じる。このような複雑ダウン$チェック()$ $ O(N + M)になります。$

 

$コード$

 

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <キュー> 
の#include <アルゴリズム>
 に#define ILインライン
 の#define Rgを登録し
 ます。#define行く(I、A、B)は(RG int型I = A ; iが<= Bと、++ I)
 の#defineはい(I、B)のための(RG INT iは=; I> = B; - I)
 の#define MEM(B)のmemset(B 、はsizeof(A))
 の#define int型、長い長い
 の#defineダブルデシベル
 の#define INF 2147483647
 使って 名前空間はstdを、
ILのINTのリード()
{ 
    たRG INT X = 0、Y =1 ; チャー C = GETCHAR()。
    一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();}
     一方、(C> = ' 0 ' && C <= ' 9 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR();}
     戻りのx *のY。
} 
のconst  int型 N = 200010 int型、M、S、N のように、minw = INF、maxw、SN [N]、SV [N]。
構造体 ND1 { INT W、V;} [N]。
構造体 ND2 { int型のL、R;} [N] B。
IL INT CALC(INT X)
{ 
    RgをINT RET = 0 
    MEM(SN、0); MEM(SV、0 ); 
    (I、行く1 、n)の
         場合([i]は.W> = X)SN [I] = SN [I- 1 ] + 1、SV [I] = SVの[I- 1 ] + [I] .V。
         SN [I] = SNは[I- 1 ]、SVの[I] =のSV [1-1 ]。
    (I、行く1 、M)
    { 
        RgをINTのL = bの[I] .L、R = B [i]は.R。
        RET + =(SN [R] -sn [1- 1 ])*(SV [R] -sv [1- 1 ])。
    } 
    戻りRET。
} 
のIL int型EF1()
{ 
    RgをINT L = minw、R = maxw、中間、Y、RET。
    一方、(L <= R)
    { 
        半ば =(L + R)>> 1 
        Y = CALC(MID)。
        もし(Y <= S)RET = Y、R =半ば1 L =ミッド+ 1 
    } 
    戻りRET。
} 
のIL int型EF2()
{ 
    RgをINT L = minw、R = maxw、中間、Y、RET。
    一方、(L <= R)
    { 
        半ば =(L + R)>> 1 
        Y = CALC(MID)。
        もし(Y> = S)RET = Y、L =ミッド+ 1 他に、R =半ば1 
    } 
    戻りRET。
} 
メイン()
{ 
    N =(読み取り)、M =(読み取り)、Sは= 読み取ります(); 
    行く(I、1、N)[I] =(ND1){(リード)(リード)}、minw =分(minw、[I] .W)、maxw = MAX(maxw、[I] .W)。
    行く(I、1、M)のb [i]は= (ND2){()、read()は読み取り}。
    RG INT Y1 = EF1()、Y2 = EF2()。
    =分(ABS(Y1-S)、ABS(Y2- S))。
    printf(" %LLDする\ n "など)。
    リターン0 ; 
} 
コードの表示

 

 

 

おすすめ

転載: www.cnblogs.com/forward777/p/11418545.html