質問が表面化:P2713ローマゲーム
ソリューション:
スーパー洪水の問題ああ、特に水。。
連隊の全員、各メンテナンスグループのプライオリティキューと最低得点は人が死亡したものを、何気なく行に書く自分自身のための最も低い、各裁判官です互いに素、設定、メンテナンス
互いに素セットが時間内にマージし、それは小さなグループにし、大規模なグループにあるヒューリスティックマージを使用することができ、これは明らかに良くなります。もちろん、生きることができるはずヒューリスティックの合併を書いていない、それは少し遅いです。
そして、我々はまた、プレスランクが233をより速く、それをマージ必ずしも必要ではないが書くことができます
コード:
1の#include <cstdioを> 2の#include <iostreamの> 3の#include <キュー> 4 使って 名前空間STDを、 5インラインint型RD(){ 6 INT X = 0。チャー C = GETCHAR()。 7 一方(C < ' 0 ' || C> ' 9 ')C = GETCHAR()。 8 一方(> = C ' 0 ' && C <= ' 9 '){X = X * 10 + C- '; C = GETCHAR();} 9 リターンX。 10 } 11 のconst int型 MAXN = 1000005、MAXM = 100005 。 12 整数N、M、FA [MAXN]、A、B、F1、F2。 13個の ブール値[MAXN]死にました。 14 CHAR [O 2 ]。 15 構造体Peoを{ 16 int型のID、データ。 17 ブール 演算子 <(CONST Peoを&A)のconst { 18 リターン a.data < データ。 19 } 20 } PEO。 21 PRIORITY_QUEUE <Peoを> PRI [MAXN]。 22インラインINT GETF(INT N){ 23 であれば(FA [N] == n)の戻りN。 24 FA [N] = GETF(FA [N])。 25 リターンFA [N]。 26 } 27 INT メイン(){ 28 N = RD()。 29 のために(int型 i = 1 ; iが= Nを<; Iは++ ){ 30 、FA [I] = I。 31 peo.id = I。peo.data = RD()。 32の PRI [i]は.push(PEO)。 33 } 34 M = RD()。 35 一方(M-- ){ 36 のscanf(" %sの" 、O)。 37 であれば(O [ 0 ] == ' M ' ){ 38 A = RD()。B = RD()。 39の F1 = GETF(A)。F2 = GETF(B)。 40 であれば(死亡[A] ||は、[B] || F1 ==死亡F2) 41を 続けます。 42 であれば(PRI [F1] .size()> PRI [F2] .size())スワップ(F1、F2)。 43 ながら(!PRI [F1] .empty()){ 44 場合(!死亡[(PRI [F1] .top())ID]) 45の PRI [F2] .push(PRI [F1] .top())。 46の PRI [F1] .pop()。 47 } 48の FA [F1 = F2。 49 } 50 他{ 51 A = RD()。 52 であれば(死亡[A]){ 53 のprintf(" 0 \ n " ); 54 続け; 55 } 56の F1 = GETF(A)。 57 もし(!PRI [F1] .empty()){ 58 のprintf(" %d個の\ n " 、(PRI [F1] .top())データ)。 図59は、 [(PRI [F1] .top())ID =死亡した1 。 60の PRI [F1] .pop()。 61 } 62 他ののprintf(" 0 \ n " ); 63 } 64 } 65 リターン 0 。 66 }
で:AlenaNuna