互いに素セット優先キュー+ +ヒューリスティックマージ||ローマゲーム|| BZOJ 1455 || Luogu p2713

質問が表面化: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

 

おすすめ

転載: www.cnblogs.com/AlenaNuna/p/11618863.html