标签:Digits ATcoder lazy qr ll mid Replace sum ql
题目
题目链接:https://atcoder.jp/contests/abl/tasks/abl_e
一开始有一个长度为 \(n\) 的全部为 \(1\) 的数列,要求支持区间覆盖为一个数 \(x(1\leq x\leq 9)\),以及求全部 \(n\) 个数字连起来 \(\bmod 998244353\)。
思路
预处理出连续 \(k\) 个数字 \(1\sim 9\) 对 \(998244353\) 取模后的结果。以及 \(10^x\) 对 \(998244353\) 取模的结果。
然后线段树维护区间和即可。
时间复杂度 \(O(m\log n)\)。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=200010,MOD=998244353;
ll n,Q;
ll mod[11][N],power[N];
struct Segtree
{
ll l[N*4],r[N*4],lazy[N*4];
ll sum[N*4];
void build(ll x,ll ql,ll qr)
{
l[x]=ql; r[x]=qr;
if (ql==qr)
{
sum[x]=1;
return;
}
ll mid=(ql+qr)>>1;
build(x*2,ql,mid); build(x*2+1,mid+1,qr);
sum[x]=(sum[x*2]*power[r[x*2+1]-l[x*2+1]+1]%MOD+sum[x*2+1])%MOD;
}
void pushdown(ll x)
{
if(lazy[x])
{
ll v=lazy[x]; lazy[x]=0;
sum[x*2]=mod[v][r[x*2]-l[x*2]+1];
sum[x*2+1]=mod[v][r[x*2+1]-l[x*2+1]+1];
lazy[x*2]=lazy[x*2+1]=v;
}
}
void update(ll x,ll ql,ll qr,ll v)
{
if (l[x]==ql && r[x]==qr)
{
sum[x]=mod[v][qr-ql+1];
lazy[x]=v;
return;
}
pushdown(x);
ll mid=(l[x]+r[x])>>1;
if (qr<=mid) update(x*2,ql,qr,v);
else if (ql>mid) update(x*2+1,ql,qr,v);
else update(x*2,ql,mid,v),update(x*2+1,mid+1,qr,v);
sum[x]=(sum[x*2]*power[r[x*2+1]-l[x*2+1]+1]%MOD+sum[x*2+1])%MOD;
}
}seg;
int main()
{
scanf("%lld%lld",&n,&Q);
power[1]=10;
for (ll i=2;i<=n;i++)
power[i]=power[i-1]*10%MOD;
for (ll i=1;i<=9;i++)
{
mod[i][1]=i;
for (ll j=2;j<N;j++)
mod[i][j]=(mod[i][j-1]*10+i)%MOD;
}
seg.build(1,1,n);
while (Q--)
{
ll ql,qr,x;
scanf("%lld%lld%lld",&ql,&qr,&x);
seg.update(1,ql,qr,x);
printf("%lld\n",seg.sum[1]);
}
return 0;
}
标签:Digits,ATcoder,lazy,qr,ll,mid,Replace,sum,ql 来源: https://www.cnblogs.com/stoorz/p/13737722.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。