2019icpc銀川ネットワークゲーム-A最大(思考)

トピックリンクします。https://nanti.jisuanke.com/t/41285

質問の意味:スタック、スタックとポップ操作のサポートを維持し、各操作の後に、最大スタックを計算し、最終的な結果を得るためにします。

アイデア:

  私は学校の演劇に静かに速く出て戦い、そして、この大会のタイトルはQAQからコピー銀川2018インビテーショナルのタイトル、主催者は本当にNiubiにある知りませんでした。

  この問題は、本当にある、と私は問題を解決するターンを取るHXC、ピットは惨めだった、常に使用データ構造が何を考えていること、ポイントが上がるとは思いませんでした。質問を考えて、各スタックが最大スタック要素を確保します。要素xの現在のスタック場合のx> = yの場合、yは、スタックの現在のトップであり、これは、スタックに直接ライン上、問題ではない; xは<Y、Y我々は、直接あるいはXに対応する場合、スタック即ちことができます。

  学び、これは多くの人々を持っていた、どのように簡単な方法に、複雑な必要はありません。

ACコード:

#include <cstdioを> 
する#include <アルゴリズム> 
の#include < セット > 
の#include <地図>
 使用して 名前空間STDを、

const  int型 MAXN = 5E6 + 5 
符号なしのtypedef int型UI。
int型T、CAS、トップ。
UI STK [MAXN]。
長い 長いANS; 

INTのN、P、Q、M。    
符号なし整数SA、SB、SC; 
符号なし整数rng61(){ 
    SA ^ = SA << 16 
    SA ^ = SA >> 5 
    SA ^ = SA <<1 ; 
    符号なしint型の T = SA; SA = SB; 
    SB = SC; 
    SC ^ = T ^ SA。
    戻るSCを。
} 

ボイドGEN(){ 
    scanf関数(" %D%D%D%D%U%U%U "、&​​N、&P、およびQ&M、&SA、及びSB、およびSC)。
    以下のためにint型 i = 1 ; iは= N <; ++ I){
         場合(rng61()%(P + Q)< P){ 
            STKの[ ++トップ] = rng61()%のM + 1 
            STK [トップ] = MAX(STK [トップ1 ]、STK [トップ])。
        } 
        
            もし(TOP> 0) - トップ。
        ANS ^ = 1LL * i *は、[トップ] STK。
    } 
} 

int型のmain(){ 
    scanf関数(" %のD "、&T)。
    一方、(T-- ){ 
        ANS = 0 
        トップ = 0 ; 
        GEN(); 
        printf(" ケース#%dを:%LLDの\ nを"、++ CAS、ANS)。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/FrankChen831X/p/11440426.html