[20190725NOIPのシミュレーションテスト8]問題解決

大麦

T1

洪水のタイトル、最初の数文字が試験に不可解なパニックの同じグループの最後に追加かを確認するにはタイトル

その後、私たちは何の直接脳が$ Oをハッシュすることができなくなりますた(N)$

KMPもカットします

タイトル、小型の識別配列を注意深く読んで

書式#include <cstdioを> 
する#include <iostreamの> 
の#include <CStringの>
 に#define再登録
 使って 名前空間はstdを、
typedefの符号なしの長い 長いULL。
CONSTの INT N = 200005ベース = 131 int型T、LA、LB; 
ULL力[N]、HA [N]、HB [N]。
チャー A [N]、B [N]、ED [ 3 ]。
インラインボイドINI()
{ 
    ためint型 i = 0 ; iは=ラ<; I ++の
        HA [I] = HB [i]は= 0; 
} 
インラインボイドワーク()
{ 
    scanf関数(" %D%dの"、&​​LA、&LB); 
    scanf関数(" %sの"、A + 1 )。
    scanf関数(" %sの" 編); 
    INI(); 
    (RE INT i = 1 iは++; I <=ポンド
        B [I] = A [i]は、
    B [ ++ LB = ED [ 0 ]。
    ため(再int型 I = 1 ; I <= LB; iは++ 
        HB [I] = HB [I- 1] * 基底 + B [i]は、
    (RE INT i = 1 ; iが=ラ<; I ++の
        HA [I] =ヘクタール[I- 1 ] * 基底 + A [i]は、
    // デバッグ();ながら(1)。
    int型 ANS = 0 ;
    ため(再int型 i = 1 ; iは=分(LA、LB)<; iは++ 
    { 
        場合(I == 1 
        { 
            場合([ 1 ] == B [LB])ANS = 1 続け; 
        } 
        場合(HA [I] == HB [LB] -Hb [LB-1] * 電力[i])と
            ANS = MAX(ANS、I)。
        // COUT <<下駄(1、I)<<」「<< getb(LB-I + 1、LB)<< ENDL。
    } 
    のprintf(" %d個の\ n " 、ANS)。

} 
int型のmain()
{ 
    scanf関数(" %のD "、&T)。
    電力[ 0 ] = 1 ;
    (RE INT i = 1 ; iが= Nを<; I ++の
        パワー[I] =電力[I- 1 ] * 基地;
    一方、(T-- )ワーク();
    リターン 0 ; 
}
コードの表示

 

T2

リンク1及びnは点ではないように、図塗装を省略しているいわゆる「唯一」に見出すことができます

これらの点は、元のポイントを切断しなければならず、満足は、nより長いユニコム後に削除します

だから、アイデアはおそらく出てきた:実行$ Tarjan $は、その後、ファックは第二の条件を満たして

nが決定されたカット点のサブツリーである場合にのみ、探索木を見つけるために後者を満たすことは困難

そして、この状態では、それは$ Ta​​rjan $アルゴリズムが何であるかを反映するには?

すなわち、カット点xに対して、yは[Y] \当量DFN DFN $満たすために、それにポイントを接続し 、[n]は$

なぜ?

$実際に意味[] DFN $を考えてみましょう:各アクセスポイントのタイムスタンプがあり、我々はポイントを決定するためにそれを使用することができますしてアクセスする必要があります

異なるサブツリー(ない本当の状況)であり、Yおよびnの場合:

その後、最初の訪問とn yを参照してください。もちろん$ DFN [Y]> DFN [X] $は、満たされていません

逆:$のDFN [Y] $更新と$ [N] DFN更新され、満足していないではありません$

yの場合はnは同じツリーを持ちます:

Y N / YがNである前に:設立します

N Yの前に(ではない真):明らかに、この時点で$ DFN [Y]> DFN [n]は$、満たされていません

 

命題が証明されました。

インラインボイド tarjan(INT X)
{ 
    低い[X] =のDFN [X] = ++ IND。
    int型フラグ= 0 以下のためにint型 I =ヘッド[X]; I; I = NXT [I])
    { 
        場合(!DFN [する[I]]) 
        { 
            tarjan(の[I])。
            低[X] = 分([I]に低、[x]は低いです)。
            もし(> = [I]に低DFN [X])
            { 
                フラグ ++ もし((X!= 1 ||フラグ> 1)&& DFN <= DFN [n]は[I]乃至])= [X] iscut1 ; 
            } 
        } 
        そうでなければ低[X] = 分(低[X]、[I]乃至] DFN)。
    } 
}

 

別の問題があります:あなたはDFN書くのは簡単であるn個のサブタッピングポイントで単一の思考をしたい場合は、[X] <DFN [n]は、

しかし、量は実際には十分ではありません、あなたが30ポイントを取得し、良い結果(霧

なぜ?

nはXの復帰から始まるルート上にある場合は終了しました。

ペイントは自分を再生することができます。

T3

形而上の質問、私は兄を参照してください問題のポイントソリューション

書式#include <cstdioを> 
する#include <iostreamの> 
の#include <CStringの>
 使用して 名前空間はstd; 
typedefの長い 長いLL。
const  int型 N = 1000005 ;
constの INF = 11 0x7fffffffffff int型T;
チャーSTR [N]。
INT S [N << 1 ]、CNT [N << 1 ]、LEN。
LLヴァル[N << 1 ]。
ボイドINI()
{ 
    ためint型 i = 1 ; iがLEN = * < 2 ; I ++
        S [i]は = CNT [I] = valの[I] = 0 ; 
} 
ボイドワーク()
{ 
    LL ANS = INF。
    scanf関数(" %sの"、STR + 1 )。
    LEN = strlenを(STR + 1 )。
    INI(); 
    以下のためにint型 i = 1 ; iは= LEN <; iは++ 
        S [I] = sの[Iがlen +] =(STR [I] == ' B '01 )。
    / * ため(INT i = 1; iが<=(LEN << 1); iは++)
        COUT << S [i]は、* / 
    のためのint型i = 1 ; iが=(LEN << < 1); iが++ 
        CNT [I] = CNTを[I- 1 ] + S [i]は、ヴァル[I] = valの[I- 1 ] + i *がSを[I ];
    int型のp = 1 ;
    以下のためにint型 i = 1 ; iは= LEN <; iは++ 
    { 
        LL RES = INF。
        INT ; J <私がlen + = + J = P 1、J ++ 
        { 
            LLのLNUM = CNT [J- 1 ] -cnt [I- 1 ]。
            LLのRNUM = CNT [I + len- 1] -cnt [J- 1 ]。
            LL和 =(ヴァル[J- 1 ] << 1)-Val [I- 1 ] -lnum * iが+ RNUM * 1LL *(I + len- 1)-Val [I + len- 1 ] - (lnum- 1)* LNUM / 2 - (rnum- 1)* RNUM / 2 もし(合計> RES)ブレーク
            RES =合計、P = J; 
            ANS = 分(ANS、RES)。
        } 
    } 
    COUT << ANS << ENDL。
} 
int型のmain()
{ 
    //COUT << 0x7fffffffffff << ENDL、一方(1)。
    scanf関数(" %のD "、&T)。
    一方、(T-- )ワーク();
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/Rorschach-XR/p/11247992.html