タイトルは非常に高い理論に見えますが、実際にはそれほど複雑ではありません。あなただけは、それぞれ、プロセスキュー、スタック、ヒープと細根大根スタックをシミュレートする必要があります。
コード内の詳細とコメント。
$の\ RMコード$
#プラグマGCC最適化(2 ) #ザ含む <ビット/ STDC ++ H.> 使用して 名前空間STD、 キュー < INT > QUE、 スタック < INT > STK; PRIORITY_QUEUE < INT > ヒープ1; PRIORITY_QUEUE < int型、ベクトル< INT >、大< INT >> ヒープ2; // C ++ STLライブラリの使用は、4つのデータ構造が定義されています:キュー、スタック、ヒープと細根大きなルートスタック int型のmain(){ のiOS :: sync_with_stdio(0)、cin.tie(0 ); int型 N;ブールフラグ[ 5 ]。 memsetの(FLAG、真、はsizeof (フラグ))。 cinを >> N。 ながら(N-- ){ int型OPT、X; CIN >>オプト>> X; もし(OPT == 1 ){ 場合(フラグ[ 1 ])que.push(X)。 もし(フラグ[ 2 ])stk.push(X)。 もし(フラグ[ 3 ])heap1.push(X)。 もし(フラグ[ 4 ])heap2.push(X)。 //ブラックボックスは、一時的なデータ構造であってもよく、OPTが1である場合、X挿入した場合 // 挿入動作がここでシミュレートされる。 } 他{ IFフラグに(que.empty())[ 1 ] = falseに、 IF(STK。空の())フラグに[ 2 ] = falseに、 IF [(heap1.empty())フラグで3 ] = falseに、 IF [(heap2.empty())フラグで4 ] = falseに; // データ構造は、すでに空の場合、フラグを直接変更 IF(フラグ[ 1 ]){ IF(que.front()!= X)フラグ[1 ] = 偽。 que.pop(); } であれば(フラグ[ 2 ]){ 場合(!stk.top()= X)フラグ[ 2 ] = 偽。 stk.pop(); } であれば(フラグ[ 3 ]){ 場合(!heap1.top()= X)フラグ[ 3 ] = 偽。 heap1.pop(); } であれば(フラグ[ 4 ]){ 場合(!heap2.top()= X)フラグ[ 4 ] = 偽。 heap2.pop(); } // アナログ削除。 } } のための(INT I = 1 ; I <= 4 ; ++ I) フラグ[I]において、プット(?" はい"):プット(" なし")。// 出力 戻り 0 ; }
ます。https://www.cnblogs.com/Xray-luogu/p/11006400.htmlで再現