[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

posted @ 2021-03-01 21:34  zkdxl  阅读(48)  评论(0编辑  收藏  举报