BZOJ 1597:[Usaco2008月] +スロープ土地の購入、動的プログラミングの最適化

コード: 

#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を返します。
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/11139251.html