BZOJ 5418:[Noi2018] Tulong龍市EXCRT +マルチセット

これは、プッシュする非常に簡単です -

#include <設定> 
の#include <cstdioを>      
する#include <ストリング>              
の#include <アルゴリズム>   
の#define N 200000 
の#defineっ長い長   
の#define ULLのunsigned long長い
使用して名前空間std。  
ボイドsetIO(文字列s){ 
    = S内の文字列+、= sのうち+ "で" "アウト"。
    freopenは(in.c_str()、 "R"、STDIN)。
    // freopenは(out.c_str()、 "W"、STDOUT)。
}   
CAS int型。    
マルチセット<LL> S; 
マルチセット<LL> ::イテレータit。   
LL A [N]、P [N]、力[N]、[N]を報います。
LLのMULT(LLのX、LLのY、LL MOD){ 
    LLのTMP =(長い二重)のx / MOD Y *。   
    リターン(MOD + * MOD(ULL)X * Y-(ULL)TMP)%MOD。
    (; kは基地= MULT(ベース、ベース、MOD)、K >> = 1)のための
        IF(K&1)
            = MULT TMP(TMP、塩基、MOD)。
    TMPを返します。    
} 
(LLのB -1,11,11-&X、LL&Y)のLL exgcd { 
    {場合(B!)
        X = 1、Y = 0。
        返します。
    } 
    LL GCD = exgcd(B、%のB、x、y)は、TMP = X。   
    X = Y、Yは、TMP-A / Bの* yを=。   
    GCDを返します。
}        
ボイドは(){解決
    S.clearを();       
    LL ANS、M、最大= 0。
    I、J、N、M、フラグ= 0、nosol = 0 int型。
    scanf関数( "%d個の%のD"、&N、&M)。   
    用(i = 1; iは= N <; ++ I)のscanf( "%のLLDを"、&A [I])。  
    用(i = 1; iは= N <; ++ I)のscanf( "%のLLDを" &P [I])。
    用(i = 1; iは= N <; ++ I)のscanf( "%のLLD"、および報酬[I])。   
    用(i = 1; I <= M; ++ I)のscanf( "%のLLD"、&パワー[i])と、S.insert(パワー[I])。                    
    用(i = 1; iが<= N; I ++){     
        LLのCUR。  
        それはS.upper_bound([I])を=。     
        もし(!それ= S.begin())it--。      
        CUR =(*これ)。     
        S.erase(それ)。              
        S.insert(報酬[I])。         
        マックス= MAX(最大値、A [i]が%のCUR == 0 A [I] / CUR:[I] / CUR + 1)。      
        ([I]> P [I]){もし
            フラグ= 1。
        } 
        、B、X、Y、C、GCD LL。
        = P [i]は、C = A [i]とB = CUR、。     
        GCD = exgcd(A、B、X、Y)、B = ABS(B / GCD)。         
        IF(C%でのGCD){
            nosol = 1。       
            ブレーク;     
        }  
        X =(MULT(X、C / GCD、B)+ B)%のB; //当前这局的           
        (I == 1)ANS = xで、M = Bの場合、       
        他{ 
            LLのcurans = xで、curM = B。   
            = M、B = curM、C = curans-ANS。     
            GCD = exgcd(A、B、X、Y)。   
            IF(C%GCD){ 
                nosol = 1。
                ブレーク; 
            }    
            B = ABS(B / GCD)。  
            X =(MULT(X、C / GCD、B)+ B)%のB;    
            ANS + = Mの*のX;     
            M * = curM / __ GCD(M、curM)。    
            ANS =(ANS%M + M)%のM。  
        } 
    }                
    もし(nosol)のprintf( " - N \ 1")。
    他のprintf( "%LLDの\ nを"、フラグマックス:?ANS)。       
} 
{main()のint型
    I、J、T int型。
    // setIO( "入力");  
    scanf関数( "%のD"、&T)。                    
    用(CAS = 1; CAS <= T; ++ CAS) 解きます)。   
    0を返します。
}

  

おすすめ

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