T1。http://ezoj.org.cn/problem/382
一見シングルソース最短であるが、直接構築図の複雑さの要件を満たしていない明らかに、M ^ 2です。
スコア100が望ましい、双方向エッジ(右だけ一つの値)に接続されたすべてのポイントのセット内の各仮想点のための新しいセットを考慮し、複雑性O(nlgm)。
// 两岸 する#include <cstdioを> する#include <アルゴリズム> 書式#include <キュー> の#include <CStringの> に#define LL長い長い の#define FN "道" の#define INF 824602269000 使って 名前空間はstd; インラインボイドオープン() { freopenは(FN " .IN "、" R " 、STDIN)。 freopenは(FN " の.out "、" W " 、STDOUT)。 1 ; LL S = 0。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = 0 ; CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 ')S =(S << 3)+(S << 1)+ CH- ' 0 '、CH = GETCHAR()。 リターン F S: - ?sの。 } PRIORITY_QUEUE<ペア<-1,11,11->> Q。 LLのB [ 100010 ]、N、M、T、S、CNT、CT、頭部[ 100010 ]、DIS [ 100010 ]。 BOOL VIS [ 100010 ]。 構造体ノード { 、NXT、ヴァルにLL。 } [ 200010 ]。 インラインボイド追加(LL から、へ-1,11,11-のヴァル) { [ ++ CNT] .TO = であり; [CNT] .val = ヴァル。 [CNT] .nxt [=先頭から]。 【ヘッドから =] CNT。 } int型)(主 { // オープン(); N = read()は、M =()を読み出す; CT = N。 用(int型 I = 1 ; I <= M Iは++ ) { int型 ++ CT; T =読み取ります() 。 用(INT J = 1 ; J <= T; J ++)B [J] = 読み取ります(); LL X = リード()。 用(INT J = 1(B [j]は、CT、追加J ++; J <= T)0 )、追加(CT、B [j]を、X)。 } 、S =読み取り()、Tは= )(読み取ります。 以下のために(int型 I = 1 VIS [I] = {DIS [I] = INF; I <= CT iは++)0;} q.push(make_pair(0、S)); DIS [S] = 0 ; 一方、(!q.empty()) { LL X = q.top()は、第2。 q.pop(); もし(VIS [X])続ける ; VIS [X] ++ ; 以下のために(int型 ; I iは=私は=ヘッドが[X] [I] .nxt) { LLのY = [I] .TOと、 もし(DIS [Y]> DIS [X] + [I] .val)DIS [Y] = DIS [X] + [I] .val、q.push(make_pair( - DIS [Y]、Y) ); } } もし(DIS [T] == INF)DIS [T] = - 1 。 printf(" %のLLD " 、DIS [T])。 リターン 0 ; }
ZYBは、建設図面nlgq + Mが、これを行うことができ、我々はそれをしなければならない?最適化を教えて
T2。http://ezoj.org.cn/problem/383
すべてのポイントは、直径を構成することができるため(実際には非常に難しい)を見つけることは困難ではない2点間のパスの直径を服用すると、各セット、私たちはこのことを維持するので、毎回のいずれかから木で、2つのセットに分割することができます二組は、時間制限の保守作業中に完了することができます。
// 两岸 する#include <cstdioを> する#include <アルゴリズム> 書式#include <CStringの> の#include <ベクトル> の#define LL長い長い の#define FN "LCT" 使って 名前空間はstdを、 インラインボイドオープン() { freopenは(FN " .IN "、" R " 、STDIN)。 freopenは(FN " の.out "、" W " 、STDOUT)。 } LL LG [ 500010 ]、N、CNT = 0、 <LL> S1、S2; 構造体ポイ { LLのDEP、FA [ 100 ]。 } D [ 500010 ]。 インライン読み取り11() { BOOLの F = 1 ; LL S = 0。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = 0 ; CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 ')S =(S << 3)+(S << 1)+ CH- ' 0 '、CH = GETCHAR()。 リターン F S: - ?sの。 } ボイドビルド(LLのX、LL FA) { D [X]の.Fa [ 0 ] = FA、D [X] .DEP = D [FA] .DEP + 1 。 用(LL I = 1、(1 Dが[X]の.Fa [i]は= D [D [X]の.Fa [1-; << I)<= D [X] .DEP iは++)1。] FA [I- 1 ]。 } インラインLLのLCA(LLのX、LLのY) { LL ANS = 0 。 もし(D [X] .DEP < D [Y] .DEP)スワップ(X、Y) 同時に(D [X] .DEP> D [Y] .DEP)ANS + = 1 <<(LG [D [x]の.DEP-D [Y] .DEP] - 1)、X = D [X]の.Fa [ LG [D [x]の.DEP-D [Y] .DEP] - 1 ]。 もし(x == y)は戻りANS。 用(LL I = LG [D [X] .DEP] - 1 ; I> = 0 ; i-- ) であれば(!D [X]の.Fa [I] = D [Y]の.Fa [i])とANS + = 1 <<(I + 1)、X = D [X]の.Fa [i]は、Yは= D [Y]の.Fa [I]を、 戻る ANS + 2を、 } int型のmain() { // オープン()。 N =読み取る()+ 1 ; LG 1 ] = 1 。 s1.push_back(1); D [ 1 ]の.Fa [ 0 ] = 0 ; D [ 1 ] .DEP = 1 。 用(LL I = 2 ; iが<= N; iが++ ) { LG [I] = LG [I- 1 ] +(1つの << LG [I- 1 ] == I)。 LLのx = read()は、(X、i)を構築します。 LL LC1 = s1.empty()?0:LCA(S1 [ 0 ]、I)、LC2 = s2.empty()?0:LCA(S2 [ 0 ]、I)。 もし(MAX(LC1、LC2)> MX) { MX =MAX(LC1、LC2)。 もし(LC1 == MX){ 用(LL jを= 0 ; J <s2.size(); J ++)場合(LCA(S2 [j]は、I)== MX)s1.push_back(S2 [J])。 s2.clear();} 他 { 用(LL jを= 0 ; J <s1.size(); J ++)場合(LCA(S1 [j]は、I)== MX)s2.push_back(S1 [J]) ; s1.clear();} } もし(MAX(LC1、LC2)== MX)(LC1 == MX?S2:S1).push_back(I)。 printf(" %d個の\ n "、s1.size()+ s2.size())。 } 戻り 0 。 }
ZYBはマングのLCTはこの質問に住むことができる私たちに教えて、私たちはそれを持って、それは何を問題ではありませんか?
T3。http://ezoj.org.cn/problem/384
クークーないメイク...... ......