質問表面:[USACO18JAN] MooTube
ソリューション:
側では、すべてのソートし、各側は、現在の要件がでスローされ、ノードの現在のエピソードが可能かを判断するために、各照会や調査のための設定チェック満たすように頼みます。
あまりにも最初の方であるが、その後、ガチョウは、行する方法はなかったの前に私は、互いに素設定するランクの順序を追加することによって、退屈、またO2を開設し、プラス素早く読み取り、およびだけで170ms。
上記の動作は何もしません
コード:
1の#include <cstdioを> 2の#include <アルゴリズム> 3 使用して 名前空間STDを、 4インラインint型RD(){ 5 INT X = 0。チャー C = GETCHAR()。 6 一方、(C < ' 0 ' || C> ' 9 ')C = GETCHAR()。 7 一方(> = C ' 0 ' && C <= ' 9 '){X = X * 10 + C- ' 0 '。C = GETCHAR()。 8 リターンX。 9 } 10 のconst int型 MAXN = 1E5 + 5、MAXQ = 1E5 + 5 。 11 INT N、Q、A、B、C、FAは[MAXN]、DEP [MAXN]、F1、F2は、今、CNTは[MAXN]、[MAXQ] ANS。 12 構造体のエッジ{ INT から、DIS、であり; }エッジ[MAXN]。 13 構造体 Query_ { int型K、X、ID。} [MAXQ] QRY。 14インラインブール CMP1(CONSTエッジと、CONSTエッジ&B){ リターン > a.dis b.dis。} 15インラインブール CMP2(CONSTQuery_と、CONST Query_&B)は{ 返す AK> BK。} 16インラインINT GETF(INT A){ 17 であれば(FA [A] == a)に戻ります。 18 FA [A] = GETF(FA [A])。 19 リターンFA [A]。 20 } 21 INT メイン(){ 22 のscanf(" %d個の%のD "、&N、&Q)。 23 のために(int型 i = 1 ; iがNを<Iは++ ){ 24 、A = RD()。B = RD()。C = RD()。 25 エッジ[I]。から = ; 26 エッジ[I] .TO = B。 27 エッジ[i]は.DIS = C。 28 } 29 のための(int型 I = 1 ; I <= Q; iは++ ){ 30 = RD()。B = RD()。 31 QRY [I]・K = A。QRY [I] .X = B。QRY [I] .ID = iは、 32 } 33 ソート(エッジ+ 1、エッジ+ N、CMP1)。 34 ソート(QRY + 1、QRY + Q + 1 、CMP2)。 35 のために(INT I = 1; iは= N <、iは++)FA [I] = I、CNT [I] = 1 。 36 今= 0 。 37 のためには、(int型 = Iを1 ; I <= Q; iは++ ){ 38 ながら(今+ 1 <= N- 1 &&エッジ[今+ 1 ] .DIS> = QRY [I]・K){ 39 今++ 。 40の F1 = GETF(エッジ[今]。から); 41の F2 = GETF(エッジ[今] .TO)。 42 であれば(F1!= F2){ 43 であれば(DEP [F1] < DEP [F2]){ 44 [F1] =ためのF2。 45 CNT [F2] + = CNT [F1]。 46 } 47 そう であれば(DEP [F1]> DEP [F2]){ 48の 行う[F2] = F1。 49 CNT [F1] + = CNT [F2]。 50 } 51 他{ 52の 作る[F1 = F2。 53 DEP [F2] ++ ; 54 CNT [F2] + = CNT [F1]。 55 } 56 } 57 } 58の ANS [QRY [I] .ID] = CNT [GETF(QRY [I] .X)] - 1 。 59 } 60 のための(int型 iは= 1のprintf(; I <= Q iが++)" %Dを\ n " 、ANS [I])を 61 リターン 0 。 62 }
で:AlenaNuna