有向非巡回グラフのN側の点Mが与えられると、各開始点の数は、各点から到達可能数えます。
入力形式
行ごとに2つの整数N、Mの最初の行、次の二つの整数yに有向辺を表し、XからM行のX、Y、。
出力フォーマット
合計N個の出力ラインは、各点に到達することができる点の数を表します。
データ範囲
1 ≤ N 、M ≤ 30000
明らかトポロジはないソート+ Fの各々に格納されたnビットのバイナリ数で、状態を圧縮することができる[x]は、ここでは1〜i番目のビットは、私はできないにx iは、0が、これはXの存在と同等であることを示しています[x]はF、Yの縁に| = F [Y]は、トポロジー前処理シーケンス、列挙を逆転し、最終的にFのそれぞれの数を決定する[I]において、しかし、バグがあっても符号なしの場合、あります小さな乾燥品があり、長い長いバイナリのみ64、下:
容器ビットセットの圧縮の状態に関する:
再現します。https://oi-wiki.org/ds/stl/bitset/は
¶説明
STDを::ビットセットは0/1格納されたデータのみが含まれている固定サイズのシーケンス標準ライブラリであります
メモリアドレスはなくビットビットよりも、バイト即ちによるアドレスバイトであるため、よく知られています、
我々は唯一の0/1を表しますが、bool型の変数を持っているだけでなく、1バイトのメモリを占め、
ビットセットの最適化は、バイトが8ビットずつ8 0/1を格納することができるように、固定されています
4バイトのint型の変数は0/1の意味でのみ存在し、ビットセットだけでその足跡
いくつかのケースでは、32を分割することによって、あなたのビットセットの複雑さを作ることができます
もちろん、のようなビットセットの保存方法のベクトルベクトル<ブール>の特殊化は、そのサポートダイナミックなオープンスペースという点で異なります、
ビットセットし、我々一般的に静的配列は、で良いスタートをコンパイル時です。
なぜ代わりにベクトル<ブール>のビットセットでしょうか?
導入に従うことで、あなたが持っているビットセットより詳細で便利な操作を見ることができます
ヘッダの#include <ビットセット> //ビット集合を含む
オペレータ¶の
オペレータは、[]:アクセス特定れます
演算子== /!=:比較2ビットセットの内容はまったく同じです
演算子&= / | = / ^ = /〜:ビット単位のAND / OR / XOR /ネゲート操作
演算子<< / >> / << = / >> =:バイナリ左/右
演算子<< / >>:あなたはCIN / COUTにより、入力および出力できることを意味し、ストリーム演算子、
ベクトル<ブール>は最初の2つだけを持っています
メンバ関数¶の
テスト()を()アクションでベクターには同じであり、[]差分演算子は境界チェックされている
カウントが():真量返し
、全体のビット集合をtrueに設定します。設定を()また、あなたのパラメータにするために設定したパラメータ渡すことができます
falseに配置された全体のビットセット:リセット()
の論理NOT / XORに対応し、(1、1が0になり0になります)、このビットが反転して1:)フリップ(。
to_stringに( ):変換された文字列表現を返し
to_ulongを():長い長い64におけるようなPOSIXと、32でNTとPOSIXシステムと同様にunsigned long型表現に変換(long int型を返す)
to_ullong()C ++ 11、リターン符号なし長い長い表現に変換する
<ブール>実質的にはないこれらのベクターの
¶効果は
一般的に、我々は、ビット集合、金網又は素数(のようなビットセットを開くために使用することができるnotprimeブール値のアレイ)を用いて、いくつかのDPの実現可能性を最適化することができます
その主な役割は、このようなアルゴリズムとして、最適化は複雑さの一定のレベルを最適化することができ、時間のメモリの最適化をオフ圧力をもたらすことであるとは限らない、明らかに一定の大きな場合の最後のカードは非常に遅いです、 O(緩い)を考慮することはできません!私たちは32次元を分割する場合は、この質問に対するこの時間より安全なことができ
実際には、だけでなく、それはアイデアビットセットのコンテナであり、我々は長い長い間、それはより便利演算子であるため、各ビットはSTLの原因とメッセージを表す内容に押し込まへの道を手渡すことができます
著者:シカゴ
リンクします。https://www.acwing.com/solution/acwing/content/899/
出典:AcWing
#include <ビット/ STDC ++ H> 使用して名前空間STDを、 typedefの長い長いLL。 const int型 INF = 0x3f3f3f3f 。 const int型 MAXN = 3E4 + 100 。 const int型 MAXM = 3E3 + 10 。 constのダブル EPS = 1E- 5 。 テンプレート <型名T>インラインボイドリード(T&X){ X = 0。T FF = 1、CH = GETCHAR()。 しばらく(!isdigit(CH)){ もし(CH == ' - ')FF = - 1 。 CH = GETCHAR()。 } 一方(isdigit(CH)){ X =(X << 1)+(X << 3)+(CH ^ 48 )。 CH = GETCHAR()。 } 、X * = FF。 } テンプレート <型名T>インラインボイドライト(T x)から{ 場合(X < 0)のputchar(' - ')、X = - X。 もし(X> 9)、書き込み(X / 10 )。 putchar(Xの%10 + ' 0 ' )。 } int型 N、M、上部に[MAXN]、B [MAXN]。 ビット集合 <MAXN> [MAXN]。 INT LIN [MAXN]、TOT = 0 。 構造体のエッジ{ int型のY、次。 } E [MAXN]。 インラインボイド追加(int型 XX、INTのYY){ E [ ++ TOT] .Y = YY。 E [TOT] .next = LIN [XX]。 LIN [XX] = TOT。 } ボイドtopsort(){ キュー < INT > Q。 以下のために(int型 i = 1 ; iが<= N; ++ I){ 場合(で、[I] == 0 )q.push(I)。 } ながら(!q.empty()){ int型のx = q.front()。q.pop(); B [ ++トップ] =のX。 用(int型 ; I; I = LIN [x]は、Y I = E [I] .next){ 場合( - に [= Y E [I] .Y] == 0)q.push(Y)。 } } } int型のmain(){ (n)を読み出します。(m)を読み出します。 以下のために(int型 I = 1 ; I <= M; ++ I){ int型のX、Y。 (x)を読み出します。(y)を読み出します。 (x、y)を加えます。 で [Y] ++ ; } topsort()。 以下のために(int型 I =頂; I> = 1 ; - I){ int型 X = B [i]は、 [X] [X] = 1 。 以下のための(int型J = LIN [X]。J; J = E [J] .next){ [X] | = [E [J] .Y]。 } } のために(int型 i = 1 ; iは= N <++ {I) COUT << [I] .count()<< ENDL。 } 戻り 0 。 }