(:暴力的な人々を演奏トピックと弟共演APIO / CTSC / WCと私の隣の大学ワットこの質問Shuaio(OH)実名推奨!)
データ範囲は、本当に頭を悩まされたときに、慎重に見ていません。。。私はO(N ^ 2)バーストハンマーをDPに思いました。。
その後、V <= 20000、この有能シェーンを見つけましたか?
暴力は、次のように私は2333年の暴力を介して実行する機会を取ることができ、少なくとも次のとおりです。
我々は、同図に[I] = iのエッジに接続されたJ公差(I <jの)最初の[J] -aの各々の全て次いで、公差の各々を列挙し、この要求は、トポロジカルソート再びピットインプログラム公差のいくつかの種類。(いずれの選挙法のみDAGとから構築だけにマップすることができるので(DAGはなぜ一方の鎖上のそれのこれはない証拠が...)で、我々は直接リンクの総数をカウントすることができます)
小さな見落としは数だけ算術シーケンスは、このような場合は、各ラウンドで再びカウントされなければならないだろう構成し、我々はそれに最後の時間をカウントする必要があるため、あります。一つの解決策は、その後、回答-nを丸める+ nの後もう一度数えることです。
暴力の数の複雑さ、O(2 * N ^ 2 *ログ(N)+ N * V)、トポロジカルソートO(N ^ 2)の背面側の総数が押し下げフロントのより複雑です、私は基数ソートや余分を書くのが面倒だけど、あるため、複雑である一方なぜなら、この質問2 * N ^ 2 *ログ(N)とN * V N及びVで同時に最大値を取得するときに正確に等しく、私はHHHHこのようなものを最適化するために、気にしないだろう
#include <ビット/ STDC ++ H> の#defineは長い長いllの 名前空間stdを使用します。 #define PBの一back のconst int型N = 1005、HA = 998244353。 インラインINTは、(int型のx、int型のY){X + = Yを追加します。?X> = HA X-HA返す:X;} インラインボイドADD(INT&X、int型のY){X + Y =。IF(X> = HA)のx = HA;} ベクトル<整数> G [N]。 INT F [N]、N、H [N]、NUM、ANS、ID [N]。 構造体ノード{ int型のX、Y、Z。 ブール演算子<(constのノード&U)のconst { 戻りZ <UZ。 } } [N * 600 + 5]。 インラインボイドTSort(){ キュー<整数> Q。 (!ID [i])とする場合q.push(i)について(I ++はint型i = 1; iが<= N)。 用(INT X;!q.empty(); q.pop()){ X = q.front()、ADD(ANS F [X])。 以下のために(INT I:G [X]){ ADD(F [I]、F [X])。 (!( - ID [I]))であればq.push(I)。 } } } インラインボイドは、(解決){ (I = 1をint型、iがN <; I ++の)のための (int型J = I + 1、J <= N; J ++)するA [++ NUM] =(ノード){I 、J、H [J] -h [I]}。 ソート(A + 1、+のNUM + 1)。 {(; I <= NUM I = J、I = 1 jは整数)のために (F + 1、F + N + 1,1)を埋める、J = I、memsetの(ID、0、はsizeof(ID))。 以下のために[I] .clear()Gを(INT i = 1; iは++; iが= N <)。 一方、(J <= NUM && [J] .Z == A [i]の.Z)G [[J] .X] .pb([J]・Y)、ID [j]の.Y] + +、J ++; TSort()、(ANS、HA-N)を追加します。 } (nは、ANS)を追加します。 } int型のmain(){ scanf関数( "%のD"、&N); 以下のために(INT i = 1; iが<= N; iは++)のscanf( "%dの"、H + i)を、 ()のprintf( "%d個の\ n"、ANS)を解きます。 0を返します。 }