$ソル$
まず、それは$ $ 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 ; }