[YNOI2018]カラフルな世界&CF896E(+互いに素-設定されたブロック)

夜の試合エレン(Atcoder&codeforces)、プラス学校の試験の見直しとして、我々は書く時間がありません。

ブロックコードはO(n√n)、バレーを掲示し、ロスCFが渡されますが、過去のごみbzojカードでは、変わっていないではありません。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
CONSTの INT N = 1E5 + 7 INTの N、M、B、B [N]、[N]、POS [N]、L [N]、R [N]、FA [N]、MX [N]、合計[N]、C [ 320 ] [N]、タグ[N]。
int型の検索(INT X){ 戻り X == FA [x]はx:FA [X] = (FA [X])を見つける;}
 ボイドビルド(int型のID)を
{ 
    ためint型 I = 1 [ID];私<= R [ID]; iが++)[I] = bの[(I)検索]、C [ID] [I] = 0 ;
    以下のためにint型 I = 1 [ID]; I <= R [ID]; iは++)FA [I] = I、和[I] = 1 以下のためのint型I = 1 [ID]; I <= R [ID]; iが++ 場合(C [ID] [I])C [ID] [I] = I、B [I] =!A [私];
    和[C [ID] [I]]] + =和[i]は、FA [I] =のC [ID] [I]]。
    一方 MX [ID](C [ID] [MX [ID]]!) - 
} 
ボイド更新(int型 ID、int型のx、int型の Y、INT V)
{ 
    ためint型 I = 1 [ID]; I <= R [ID]; iが++)[I] =のB [(I)検索]。
    以下のためにint型 I = 1 [ID]; I <= R [ID]; iは++)C [ID] [I] = 0 ;
    int型私は++; iが= yと<I = xを)場合(B [(I)検索] -タグ[ID]> V)[1] - = V。
    int型 B [i]は[I] =、FA [I] =; I <= R [ID] I ++は、I = 1 [ID])I。
    (ID)を構築します。
} 
ボイド(変更int型のx、int型、YをINT V)
{ 
    場合(POS [X] == POS [Y]){更新(POS [X]は、X、Y、V)。返す;} 
    更新(POS [X]は、X、R [POS [X]]、V)、更新(POS [Y]、L [POS [Y]、Y、V)。
    以下のためにint型 I = POS [X] + 1 ; iは++; iがPOS [Y < 場合(V <MX [I] -tag [I] && MX [I] -tag [i]が< 2 * V)
    { 
        ためにINT J =タグ[I] + V +1 ; J <= MX [I]; J ++ 場合(C [I] [J])
             であれば(C [I] [JV])C [i]は[JV] = Cを[I]、[J]、B! [C [I] [J] = JV、C [I] [J] = 0 ;
            他の FA [i]の[j]をC [i]の[j]をC] = Cの[i]の[JV]、合計[C [i]の[JV]] + =合計、[[I] [J] C] = 0 ;
        しばらく(!C [i]の[MX [I]])MX [i]は- 
    } 
    そう であれば(MX [I] -tag [I]> = 2 * V)
    { 
        ためINT J =タグ[I] + 1 ; J <=タグ[I] + V; J ++ 場合(C [I] [J])
             であれば(!C [I] [J + V])C [I] [J + V] = Cを[I]、[J]、B [C [I] [J] = J + V、 C [I] [J] = 0;
            他の FA = cは、[I] [J + V]、合計[C [i]の[J + V]] + =合計[[I] [J] C]、I [C [i]の[j]をC] ] [J] = 0 ; 
        タグ[I] + = V。
    } 
} 
int型の照会(int型のx、int型の Y、INT V)
{ 
    int型 RET = 0 場合(POS [X] == POS [Y])
    { 
        ためには、int型 I = xを、私は= yと<; I ++の)場合(B [見つける(I)] -タグ[POS [I]] == V)RET ++ ;
        リターンRET; 
    } 
    のためのint型 I = xを、I <= R [POS [X]]; iは++)場合(B [検索(I)] -タグ[POS [I]] == V)RET ++ int型 ; iは= yと<I ++は、I = 1 [POS [Y])場合(Bは[(I)検索] -タグ[POS [I]] == V)RETを++ 以下のためにint型 I = POS [X] + 1 ; iはPOS [Y <; iは++)の場合(V +タグ[i]は<N)RET + =合計[C [i]と[V + タグ[I]]]。
    リターンRET; 
} 
int型のmain()
{ 
    scanf関数(" %d個の%のD "、&​​N、&M)、Bは= SQRT(N)。
    以下のためにint型 i = 1 ; iが<= N; iは++)(scanf関数を" %のD "、&​​[i])と、[i]は= B [i]は、FA [I] = I。
    にとってint型 i = 1 ; iがn = <; iは++ 
    { 
        R [POS [I] =(I- 1)/ B + 1 ] = I。
        もし(!L [POS [I])L [POS [I] = I。
    } 
    のためにint型 i = 1 ; iが= POSを<n]は、iが++)MX [I] = 1E5、(i)を構築します。
    一方、(M-- 
    { 
        int型の OP、X、Y、V; scanf関数(" %D%D%D%D "、&​​OP、およびX&Y、およびV)。
        場合(オペアンプ== 1)変更(X、Y、V)。のprintf(" %d個の\ nを"、クエリ(X、Y、V))。
    } 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/hfctf0210/p/10960531.html