質問A:世界のライン
制限時間:1秒 メモリ制限:256メガバイト
フェイス質問
彼は公に質問に直面して減少しました。
問題の解決策
私はちょうど試験でビットセット終了していましたか???しかし、私は考えていなかったとき、レースはビットセットです......
私は空間と時間の複雑さの波を埋めるために退廃的な仕上げああラッシュをBITSETなかったと言って......
(これが問題であることを神の約束に従って??フルーツビットセット)最適化ビットセットの暴力
宛先ノードが現在のノードまたはターゲットノードビットセットビットセットの値の直接使用より発見された場合に適切なタイミングで、DFSに留意されたいです。
6E4の$爆撃スペース×$ 6E4があります。3E2の$×$の6E4を開くと、その後半々に実行されます。
、半分直接決意とn / 2缶の関係を実行する方法については。
実現は、コードを見てください。
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <キュー> の#include <スタック> の#include <cmath> の#include <アルゴリズム> 書式#include <ビットセット> #defineし RINTがint登録し ます。#define読み( )A = INIT() の#define MAXN 60050 の#define MAXM 100050 使用して 名前空間STDを、 インラインint型のinit() { int型 = 0、B = 1。チャー CH = GETCHAR()。 しばらく(CH < "0 ' || CH> ' 9 '){ 場合(CH == ' - ')B = - 1 ; CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 '){= (<< 3)+(<< 1)+ CH- ' 0 ' ; CH = GETCHAR();} 戻り *のBと、 } ビット集合 <MAXN / 2 > ビット[MAXN]。 INTの N、M、MID、デュ[MAXN]。 // 書き込み INTの TOT、最初の[MAXN]、V [MAXM]、NXT [MAXM]。// フロントスター ブールDEV、VIS [MAXN]。 インラインボイド追加(INT UU、INT VV) { V [ ++ TOT =のVV、第NXT [TOT] = [UU]、最初の[UU] = TOT。 } インラインボイド DFS(int型X) { VIS [X] = 1 。 もし(!DEV){ 場合(X <= MID)ビット[X]。セット(x);} そう { 場合(X> MID)ビット[X]。セット(X- MID);} 用(RINT I =最初の[X]; I; I = NXT [I]) { 場合(!VIS [V [I])DFS(V [I])。 ビット[X] | = ビット[V [i]は]; } を返します。 } int型のmain() { (N)を読み出し、(m)を読み出します。 ため(RINT I = 1 ; I <= M; in_u、in_v ++ I) 、(in_u)を読み出す(in_v、in_u)を追加し、(in_v)読み取り、デュ[in_v] ++ ; ミッド = N / 2 ; DEV = 0 。 用(RINT I = 1、I ++; iが<= N)であれば(!デュ[i])とDFS(I)。 用(RINT I = 1; ++; iが<= N I) { ANS + = ビット[I] .count()。 ビット[I] .RESET()。 } のmemset(VIS、0、はsizeof (VIS))。 DEV = 1 。 用(RINT I = 1、I ++; iが<= N)であれば(!デュ[i])とDFS(I)。 用(RINT I = 1 ; I <= N; ++ I)ANS + = ビット[I] .count()。 coutの << ANS-NM << てendl; }