クエリと[CF 1264 C]美しいミラー

質問の意味:

あなたは$ N $ミラー、私はあなたフェアの$のP_ {I} $の確率を持っている$ $の壁に鏡を持っていますか。

1日目からは、$ 1、N $あなたは美しかったターンミラーに要求されます。

最初の$ iがミラーを$場合、あなたは、米国および最初の$ I + 1 $ミラーを明日に聞いていきますと言います。

そうしないと、壁第一の復活ポイントのフロントミラーミラー明日からお問い合わせを開始します。ミラー1は最初だけ復活ポイントです。

あなたは米国であると言うとき場合は最初の$ N $ミラーは幸せ数になります。

$ Q $の操作があり、壁になり上のミラーを変更するには、各操作は、/復活ポイントになっていません。

各操作の後、あなたは幸せ番号を期待することができますどのように多くの日を見つけます。

$ N、Q \当量2 \回10 ^ {5} $。

 

ソリューション:

希望直線式をプッシュして、複雑ではない見つけ、考えるようになりました。

実際には、我々は唯一のアイデアをプッシュする最も簡単な計算式を必要とします。

E_の日の{I} $ $に設定予想される数は、N $から$ $ $私に来ます。

则有$ E_ {I} = P_ {I} \回(1 + E_ {I + 1})+(1-P_ {I})\回(1 + E_ {1})$。

$ E_ {1} = \ FRAC {1} {P_ {N}} + \ FRAC {1} {P_ {n}はP_ {N-1}} + \ cdotsを与える$ E_ {1} $、約手動除去+ \ FRAC {1} {P_ {n}はP_ {N-1} \ cdots P_ {1}} $。

だから、簡単に全体のシーケンス番号の復活ポイントの範囲に分割して見つけることが、この問題の復活ポイントを考えてみましょう。

各セクションは独立しています。すなわち、$ ANS = \和{E _ {[F_ {I-1}、F_ {I}]}} $。

我々は、$ E _ {[L、R]は} $方法計算する考えます。

$ Eを与えるために、式上記プロモーション、_ {[L、R]} = \ FRAC {1} {P_ {R}} + \ FRAC {1} {P_ {R} P_ {R-1}} + \ cdots + \ FRAC {1} {P_ {R} P_ {R-1} \ cdots P_ {1}} $。

私たちは、$ P_に$ S_ {I} $を設定{1} P_ {2} \ cdots P_ {I} $、そこ

$ E _ {[L、R]} = \ FRAC {(P_ {R-1} P_ {R-2} \ cdots P_ {L} + P_ {R-2} P_ {R-3} \ cdots P_ {L } + \ cdots + P_ {L} +1)} {\ FRAC {S_ {R}} {S_ {L-1}}} $。

私たちはその後、セットの$ SS_ {I} = S_ {1} + S_ {2} + \ cdots + S_ {I} $、そこ

$ E _ {[L、R]} = \ FRAC {\ FRAC {(SS_ {R-1} -ss_ {L-1})} {S_ {L-1}} + 1} {\ FRAC {S_ {R }} {S_ {L-1}}} $。

だからO(nlogn)$ $を達成するために$セット$メンテナンス復活ポイントを使用しています。

 

コード:

<ビット/ STDC ++ H>の#include
 の#define MAXN 200005
 の#define MAXM 500005
 の#define INF 0x7FFFFFFFで
 の#define MOD 998244353
 の#define LL長い長
 の#defineデバッグ(X)CERR <<#X << ":" << X < <ENDL
 の#define FGX CERR << "--------------" <<てendl
 の#define DGX CERR << "==============" < <ENDL 使用して名前空間はstdを、
LL S [MAXN]、SS [MAXN]。セット < 整数 > ST; 
インライン)(読み取りっ{ 
    LL X = 0、F = 1チャー C = GETCHAR()。
    ために
 
 

 (;!isdigit(C); C = GETCHAR())場合(C == ' - ')、F = - 1  X = X *(C = GETCHAR(); isdigit(c)参照)10 + C- ' 0 ' リターンのx * F; 
} 
 
インラインLLパワー(-1,11,11- B){LL ANS = 1一方、(b)は、ANS =(B&1?ANS、A = A *%のMOD、B >> =)ANS * A%MOD 1リターンANS;} 
インラインLL INV(LL X){ 戻り力(X、mod- 2 );} 
インラインのLL MO(LL X){ リターン X> = MOD X-?MOD:X;}
インラインLL CALC(LL、L、LL R){ リターン(MO(SS [R- 1 ] -ss 1- [ 1 ] + MOD)* INV(S [1- 1 ])%のMOD + 1)* INV(S [ R] * INV(S [1- 1 ])%MOD)%のMOD;} 
 
int型のmain(){ 
    LL N =(読み取り)、Q =(読み取り)S [ 0 ] = 1 ;
    以下のための(iは= LL 1、I <= N; I ++ ){ 
        LL X =読み取る()* INV(100)%のMOD。
        S [i]は = S [I- 1 ] * X%MOD、SS [I] =(SS [I- 1 ] + S [i])と%のMOD。
    } 
    st.insert(1)、st.insert(N + 1 )。
    LL ANS =(SS [N- 1 ] + 1)%のMOD * INV(S [N])%のMOD。
    一方、(q-- ){
         int型のx = リード()。
        セット < 整数 > ::イテレータそれは= st.lower_bound(X)を、
        もし(*それ== X){
             int型の L * =( - IT);それ++。int型、R =(*(++ IT)); // COUT << 1 << ":" << L <<」「<< R << ENDL。
            ANS = MO(ANS-CALC(L、X- 1)+ MOD)、ANS = MO(ANS-CALC(X、R- 1)+ MOD)、ANS = MO(ANS +計算値(L、R- 1 ) )、st.erase(X)。
         L * =( - IT);それ++。int型、R =(*これ)。// COUT << 2 << ":" << L <<」「<< R << ENDL。
            ANS = MO(ANS-CALC(L、R- 1)+ MOD)、ANS = MO(ANS +計算値(L、X- 1))、ANS = MO(ANS +計算値(X、R- 1 ))、 st.insert(X)。
        } 
        のprintf(" %I64d \ n " 、ANS)。
    } 
    戻り 0 
}
C

 

おすすめ

転載: www.cnblogs.com/YSFAC/p/12003135.html