羅区$ P1155 $ソート貪欲+デュアルスタック2部グラフマッチング

ポジティブソリューション:+二部グラフマッチング貯金箱

レポートの問題解決:

ポータル$ QwQ $

ひざまずい,,,私は、どのくらいああのは本当にQAQ $を$ません見つける,,,私はほとんど$ NOIP $カンをしたと思いました

カンその後、$ QwQ $タイトルを横に

まず、1つしかない場合、スタックケースを考えてみ?あなたが言う場合は$があり、私は<jの<K $と$ p_k <P_I <$のGGの$上p_j $

今、私たちは2つのスタックを発見した状況がそう明らかアウン$ QwQ $染色failed説明なしソリューション聖歌場合を着色二部グラフを検討?このシーケンスには存在しないように?2つの系列に分割になります。

その後、プログラムの出力を検討する解決策は、仕上げを宣告しない?これは明らかに単なる貪欲聖歌です。

まず、このスタック割り当ては、明確にスタックの前に最優先であるので、あなたは前の文で一緒にあなたが前から後ろにスイープ何の解決を行うことができ、最初のスタックに最初のスタックに入れることができます。

$ポップがありますので、注文$プッシュ$聖歌上のプログラムの出力は?しかし、(1)$のプッシュに優れ$(2)$、ので、すべての$のプッシュ(2)$彼らは$ポップに持って前に(1 )$鴨

そして、$?$乗り越え

カン具体的なコードは$ QwQ $うそ

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define ILインライン
 の#define GC GETCHAR()
 の#define T(I)エッジ[I] .TO
 の#define W(I)は、エッジ[I] .wei
 の#define RI登録INT
 の#define RC登録チャー
 の#define RBブール・レジスタ
 位定義のRP(I、x、y)を(RI I = xで、iは<= Y; ++ I)
 #defineする私(I、x、y)を(RI I = xに対して、I> = Y; -私は)
 の#define E(I、X)が(RI I =ヘッド[X]; I; I =エッジ[I] .nxt)のconst int型 N = 1000年 + 10 INTの N、P [N]、MN [N]、ヘッド[N]、ed_cnt、COL [N]、POS = 1 

 構造体 ED { INT NXT、へ;}エッジ[N * N << 1 ]。
スタック < INT > STCK [ 2 ]。

ILのINTのリード()
{ 
    たRC CH = GC; RI X = 0 ; RB、Y = 1 しばらく(CH =!' - ' &&(CH> ' 9 ' || CH < ' 0 '))CH = GC;
    もし(CH == ' - ')CH = GC、Yは= 0 ;
    しばらく(CH> = ' 0 '' 9 ')X =(X << 1)+(X << 3)+(CH ^ ' 0 ')、CH = GC。
    返す yはX: - ?X; 
} 
IL ボイド広告(RI X、YをRI){エッジ[++ ed_cnt] =(ED){X、ヘッド[Y]};頭部[Y] = ed_cnt;エッジが[++ ed_cnt] =(ED){Y 、ヘッド[X]};頭部[X] = ed_cnt;} 
IL ボイドプリント(RI X)
{ 
    スイッチ(X)
    { 
        ケース 1:{のprintf(" A ")。ブレーク;}
         ケース 2:{のprintf(" B ")。ブレーク;}
         ケース 3:{のprintf(" C ")。ブレーク;}
         ケース 4:{のprintf(" D ")。ブレーク;} 
    } 
} 
ILのブールポップ(RI OPT)
{ 
    場合(STCK [OPT] .empty()&& STCK [OPT] .top()== POS!)戻りプリント((OPT + 1)<< 1)、STCK [OPT] .pop()、++ POS、1 リターン 0 ; 
} 
IL ボイドプッシュ(RI X、RI OPT)
{ 
    場合(OPT) 一方(POP(0))。// のprintf( "X =%D OPT =%d個の\ n"、X、OPT)。
    しばらく(!STCK [OPT] .empty()&& STCK [OPT] .top()<x)の場合は、ポップ(!(ポップ(OPT)!)OPT)。
    もし(OPT) 一方(POP(0)); STCK [OPT] .push(x)は、プリント(OPT << 1 | 1 )。
} 

int型のmain()を
{ 
    N =(読み取り); RP(I、1、N)P [i]を読み出す=(); MN [N + 1 ] = N;私の(I、nは、1)MN [I] =分(MN [I + 1 ]、P [I]); RP(I、1、n)のRP(J、I + 1、n)の場合(MN [J + 1<P [I] && P [I] <P [J])AD(i、j)は、COL [I] = COL [J] = - 1 
    RP(I、1 、n)の
         場合((〜!COL [I]))
        { 
            キュー < INT > Q; Q.push(I); COL [I] = 0 ;
            一方、(!Q.empty())
            { 
                RI NW = Q.front(); Q.pop()。
                E(I、NW){ 場合(COL [T(I)] == COL [NW])戻りのprintf(" 0 \ n ")、0もし(!(〜COL [T(I)]))Q.push(T(i))を、COL [T(I)〕=!COL [NW];}  
            }
        } 
    RP(I、1、n)がプッシュ(P [i]は、COL [I]); RB FLG = 1一方、(FLG){FLG = 0一方、(POP(0))FLG = 1一方、(POP(1))FLG = 1 ;}
     戻り 0 
}
コードの表示

おすすめ

転載: www.cnblogs.com/lqsukida/p/11410011.html