コード:
#include <ビット/ STDC ++。H> に#define MAXN 1000000 の#define LL長い長 の#define X(I)(B [I + 1]) の#define Y(I)(F [i])と の#define setIO(S) freopenは(S ".IN"、 "R"、STDIN) 名前空間stdを使用。 INT A [MAXN]、ARR [MAXN]、Q [MAXN]、TOT、頭部、尾部、 LL [MAXN]、B [MAXN]、F [MAXN]、U [MAXN]、V [MAXN]。 BOOL CMP(I、INT J INT) { Uを返す[I] == U [j]は、V [i]が<V [J]:U [I] <U [j]を。 } ダブルスロープ(INT I、INT J) { リターン(ダブル)(1.00 * Y(I)-y(J))/(ダブル)(1.00 * X(J)-X(I))。 } int型のmain() { // setIO( "入力")。 int型nは、I、J。 scanf関数( "%のD"、&N); scanf関数( "%のLLDの%のLLD"、&U [i]は、&V [i])と、A [I] = I(; iは<= N I ++ I = 1)のために、 ソート(A + 1、A + 1 + N、CMP)。 用(i = 1; iが<= N; ++ I) { 一方(V [A [I]]> = B [TOT] && TOT)--tot。 ++ TOT、[TOT = U [A [I]、B [TOT]はV [Aを[I]] =。 } N = TOT、ヘッド=尾= 0。 用(i = 1; iは= N <; ++ I) { 一方(ヘッド<尾&&スロープ(Q [頭部]、Q [ヘッド+ 1])<[i])と++ヘッド。 F [I] = F [Q [ヘッド] + [I] * B [Q [ヘッド] +1]。 一方、(ヘッド<尾&&スロープ(Q [尾]、I)<スロープ(Q [テール1]、i))を--tail。 Q [++尾] = I; } のprintf( "%LLDする\ n"、F [N])。 0を返します。 }