[CF1264C] Beautiful Mirrors with queries
\(\text{Problem}:\)题目链接
\(\text{Solution}:\)
首先要会不修改的情况,用 \(p\) 来表示答案。做法可见 Link。
考虑相邻两个标记点 \(x,y\) 之间的答案可以看作独立的从 \(x\rightarrow y\)。
在 \(x\rightarrow y-1\) 的所有点,都可以返回 \(x\),所以有:
\(f(x)=f(y)+\cfrac{1+p_{x}+p_{x}\times p_{x+1}+...+p_{x}\times p_{x+1}\times ... \times p_{y-2}}{p_{x}\times p_{x+1}\times ... \times p_{y-1}}\)
这个式子可以 \(O(n)\) 预处理,对于一组 \((x,y)\) 实现 \(O(1)\) 查询。
\(f(1)=f(1)-f(x_{1})+f(x_{1})-f(x_{2})+...+f(x_{k})-f(n)\)。
所以维护每两个标记点之间的答案和即可。
用 \(set\) 维护标记点,可以方便的求出一个位置的前驱和后继,时间复杂度 \(O(n\log n)\)。
\(\text{Code}:\)
#include <bits/stdc++.h>
#pragma GCC optimize(3)
#define int long long
#define ri register
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define is insert
#define es erase
using namespace std; const int N=200010, Mod=998244353;
inline int read()
{
int s=0, w=1; ri char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
return s*w;
}
int n,Q,a[N],inv,mul[N],qz[N],Ans,imul[N];
inline int ksc(int x,int p) { int res=1; for(;p;p>>=1, x=x*x%Mod) if(p&1) res=res*x%Mod; return res; }
set<int> g;
inline int Get(int l,int r)
{
return ((qz[r-2]-qz[l-1]+Mod)*imul[l-1]%Mod+1)*mul[l-1]%Mod*imul[r-1]%Mod;
}
signed main()
{
n=read(), Q=read();
inv=ksc(100,Mod-2);
for(ri int i=1;i<=n;i++)
{
int x=read();
a[i]=x*inv%Mod;
}
mul[0]=1;
for(ri int i=1;i<=n;i++) mul[i]=mul[i-1]*a[i]%Mod;
imul[n]=ksc(mul[n],Mod-2);
for(ri int i=n;i;i--) imul[i-1]=imul[i]*a[i]%Mod;
for(ri int i=1;i<=n;i++) qz[i]=(qz[i-1]+mul[i])%Mod;
Ans=(qz[n-1]+1)*imul[n]%Mod;
g.is(1), g.is(n+1);
for(ri int i=1;i<=Q;i++)
{
int x=read();
auto it=g.find(x);
if(it!=g.end())
{
auto now=it; now++;
int R=(*now);
now=it, now--;
int L=(*now);
g.erase(it);
(Ans+=Get(L,R))%=Mod;
Ans=(Ans-Get(L,x)-Get(x,R)+Mod+Mod)%Mod;
}
else
{
g.insert(x);
it=g.find(x);
auto now=it; now++;
int R=(*now);
now=it, now--;
int L=(*now);
Ans=(Ans-Get(L,R)+Mod)%Mod;
(Ans+=Get(L,x)+Get(x,R))%=Mod;
}
printf("%lld\n",Ans);
}
return 0;
}
CF1264C Beautiful Mirrors with queries
夜畔流离回,暗叹永无殿。
独隐万花翠,空寂亦难迁。
千秋孰能为,明灭常久见。
但得心未碎,踏遍九重天。