トピックリンクします。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 。 }