フェイス質問
https://www.luogu.org/problem/P5319
北京は妹を回復するために失敗し、唯一の北京の地方選挙を書くことができます。。。。
問題の解決策
#include <cstdioを> する#include <iostreamの> する#include <CStringの> する#include <キュー> の#include <cmath> の#include <ベクトル> の#define N 2000 の#define M 2000 の#define EPS 1E-7 の#define INF 1000000007.0 の#define int型里登録 使って 名前空間はstdを、 構造体ノード{ int型プリ、トランス。 } G [N] [M]。 チャーS [N]。 チャーT [N]。 INTのN、M。 構造体AC { INT NEX [N]、CH [N] [ 10 ]。 INT CNT [N]。 ダブルV [N]、NV [N]。 ダブルF [N] [M]。 ベクトル < 整数 > 息子[N]; int型のTOT; ボイドインサート(ダブルX){ int型今= 0 。 用(RI I = 1、L =用のSTRLEN(S + 1 ; iが= Lを<Iは++){) INT C = S [I] - ' 0 ' 。 もし CH [今] [C] = ++(CH [今] [C]!)TOT。 今 = CHを[今] [C]。 } [今] CNT ++ 。 V [今]= X。 } ボイドgetfail(){ キュー < INT > Q。 用(RI i = 0 ; iは= < 9 ; iは++)場合(CH [ 0 ] [i])とq.push(CH [ 0 ] [I])。 一方、(!q.empty()){ int型のx = q.front()。q.pop(); 以下のために(RI i = 0 ; iは= < 9 ; iは++ ){ int型、Y =のCH [X] [I]; もし(!Y)CH [X] [I] = CH [NEX [X] [i]は、他 NEX [Y] =のCH [NEXの[X] [i]は、q.push(Y)。 } } } ボイド DFS(INT X){ NV [X] + = NV [NEX [X]]。 用(RI i = 0 ; I <息子[X] .size(); iは++ ){ DFS(息子[X] [I])。 } } ボイドのinit(){ 用(RI i = 1 ; I <= TOT; iは++ )息子[NEX [I]一back(I)。 } ブールチェック(ダブルMID){ ダブル DV =ログ(MID)/ログ(1.0001 )。 用(RI i = 0 ; I <= TOT; iは++)NV [I] = V [i]は-dv * CNT [i]は、 DFS(0 )。 用(RI i = 0 ; I <= N; I ++ ) のための(RI J = 0 ; J <= TOT; J ++)[I] [J] = F - INF。 F [ 0 ] [ 0 ] = 0 。 用(RI i = 0 ; I <= N- 1、I ++)であれば(T [I + 1 ] == ' ' ){ 用(ロードアイランドJ = 0 ; J <= TOT; J ++ ) のための(RI C = 0 ; C <= 9、C ++)であれば(F [I] [J] + NV [CH [J] [C]> F [I + 1] [CH [J] [C]]){ G [I+ 1 ] [CH [J] [C] = (ノード){J、C}。 F [I + 1 ] [CH [J] [C] = F [I] [J] + NV [CH [J] [] C]。 } } 他{ 用(ロードアイランドJ = 0 ; J <= TOT; J ++ ) のための(RI C = T [I + 1 ] - ' 0 ' ; C <= T [I + 1 ] - ' 0 '、C ++)であれば( F [I] [J] + NV [CH [J] [C]> F [I + 1 ] [CH [J] [C]]){ G [I + 1 ] [CH [J] [C] = (ノード){J、C}。 F [I 1+ ] [CH [J] = F [I] [J] + [C] NV [CH [J] [C]。 } } のための(RI i = 0 ; I <= TOT; iは++)場合(F [N] [i]が> 0)リターン 1 。 リターン 0 ; } ボイドプリント(){ int型、P = 0 。 用(RI i = 0 ; I <= TOT; iは++)場合(F [N] [I]> F [N] [P])P = I。 int型のSS [N]。 用(RI I = N; I> = 1 ; i-- ){ SS [I] = G [i]が[P] .trans。 P =G [i]が[P] .PRE。 } のための(RI i = 1 ; I <= N; iは++)COUT << SS [i]は、 } }トライ。 INT メイン(){ scanf関数(" %d個の%のD "、&N、&M)。 scanf関数(" %sの"、T + 1 )。 ダブルX; 用(RI i = 1 ; I <= M; iは++ ){ scanf関数(" %sの%のLF "、S + 1、およびX)。 trie.insert(ログ(X) /ログ(1.0001 ))。 } trie.getfail()。 trie.init(); ダブルポンド= 1.0、RB = 1E9; 用(RI i = 1 ; iは= < 45 ; iは++ ){ ダブルミッド=(LB + RB)/ 2.0 。 もし(trie.check(MID))ポンド=ミッド; 他の RB = ミッド; } // COUT << LB << ENDL。 trie.print(); リターン 0 ; }