ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题解 CF1264C 【Beautiful Mirrors with queries】

2021-01-20 12:35:22  阅读:189  来源: 互联网

标签:Beautiful prod 题解 ll queries times ans include MOD


  • CF1264C 【Beautiful Mirrors with queries】

一道期望入门好题,有着非常巧妙的解法。


  • Prelude

对于这个题面我们一眼望去会想到线性递推一个期望dp式子求解。

但是发现无法实现。

原因很明显,对于断点的修改和维护,我们并不能每次都重新 \(O(n)\) 做一遍

我又想到用数据结构维护答案,但是其实大材小用了。

其实我们只需要推出一个区间的通项式来 \(O(1)\) 求解即可。

这种思路其实经常存在于一些线段树的数据结构题中,推出可行的懒惰标记的 \(O(1)\) 下传公式。

至少我是在 \(\texttt{P6327}\) 和 \(\texttt{P2122}\) 中深有这种体会。


  • Solution

推dp时,我们考虑题面中 \(\text{从编号小于等于当前镜子的且最近的检查点开始提问}\) 中不难想到为了防止后效性,我们

应该定义 \(f_i\) 为从 \(i\) 点开始询问一直到 \(n\) 点的期望值。

起初每次伤心后会从第一个点开始。则有

\[f_i=p_i\times f_{i+1}+(100\%-p_i)\times f_1 \]

移项消元得到

\[f_1=\frac{1}{p_n}+\frac{1}{p_n\times p_{n-1}}+\dots+\frac{1}{p_n\times p_{n-1}\times \dots\times p_{1}} \]

毕竟 \(f_1\) 就是 \(f(1\rightarrow n)\) ,那么根据 期望 的线性性质我们可以引入区间 \([l,r]\) ( \(l,r\) 都是复活点), 可以得到

\[f_l-f_r=f(l\rightarrow r)=\frac{1}{p_r}+\frac{1}{p_r\times p_{r-1}}+\dots+\frac{1}{p_r\times\dots\times p_l} \]

\[=\frac{\prod_{i\in [l,r-1]}p_i+\prod_{i\in [l,r-2]}p_i+\dots+p_l+1}{\prod_{i=1}^rp_i/\prod_{i=1}^{l-1}p_i} \]

那么现在我们又只需要维护:

  • \(\displaystyle m_x=\prod_{i=1}^{x}p_i\) (分母);
  • \(\displaystyle s_x=\sum_{i=1}^xm_i\) (分子);
  • 和 \(\displaystyle ans=\sum_{l,r\in \texttt{check-points}} f(l\rightarrow r)\);

每次修改的 \(\texttt{check-points}\) 可以用 set 在 \(O(\log n)\) 时间维护。


  • Code

题面有要求求逆,而逆元可以直接用快速幂求解。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
//#include<bits/stdc++.h>

#define ll long long
#define ull unsigned long long
#define INL inline
//Tosaka Rin Suki~
using namespace std;

INL void read(ll &x)
{
	 x=0;ll w=1;
	 char ch=getchar();
	 while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
	 if(ch=='-')w=-1,ch=getchar();
	 while(ch>='0'&&ch<='9')
	 {x=(x<<1)+(x<<3)+ch-48,ch=getchar();}
	 x*=w;
}

INL int mx(int a,int b){return a>b?a:b;}
INL int mn(int a,int b){return a<b?a:b;}

const ll MOD=998244353;
const int N=200005;

ll n,q,p;
ll prod[N],sp[N];
set <int> s;

inline ll P(ll x,ll p)
{
    ll res=1;
    while(p)
    {
        if(p&1)res=res*x%MOD;
        x=x*x%MOD;p>>=1;
    }
    return res;
}

inline ll calc(ll l,ll r)
{
    ll phi=sp[r-1]-sp[l-1]+MOD;
    if(phi>=MOD)phi-=MOD;
    return (phi*P(prod[l-1],MOD-2)%MOD+1)*P(prod[r]*P(prod[l-1],MOD-2)%MOD,MOD-2)%MOD;
}

int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
    read(n);read(q);
    prod[0]=1;
    for(int i=1;i<=n;i++)
    {
        read(p);p=p*P(100,MOD-2)%MOD;prod[i]=prod[i-1]*p%MOD;
        sp[i]=(sp[i-1]+prod[i])%MOD;//维护前缀积和前缀积的前缀和
    }
    ll ans=(sp[n-1]+1)%MOD*P(prod[n],MOD-2)%MOD;
    s.insert(1);s.insert(n+1);
    for(int i=1;i<=q;i++)
    {
        read(p);
        set<int>::iterator it=s.lower_bound(p);
        if(*it==p)
        {
            int l=*(--it);
            it++;
            int r=*(++it);
            ans=ans-calc(l,p-1)+MOD;
            if(ans>=MOD)ans-=MOD;
            ans=ans-calc(p,r-1)+MOD;
            if(ans>=MOD)ans-=MOD;
            ans+=calc(l,r-1);
            if(ans>=MOD)ans-=MOD;
            s.erase(p);//非复活点
        }
        else
        {
            int l=*(--it);
            it++;
            int r=*it;
            ans=ans-calc(l,r-1)+MOD;
            if(ans>=MOD)ans-=MOD;
            ans=ans+calc(l,p-1)+MOD;
            if(ans>=MOD)ans-=MOD;
            ans+=calc(p,r-1);
            if(ans>=MOD)ans-=MOD;//参考公式
            s.insert(p);//复活点
        }
        printf("%lld\n",ans%MOD);
    }
	return 0;
}

标签:Beautiful,prod,题解,ll,queries,times,ans,include,MOD
来源: https://www.cnblogs.com/reywmp/p/14302186.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有