首页 > 其他 > 详细

CF1380F.Strange Addition(线段树维护矩阵乘法)

时间:2020-07-18 22:42:14      阅读:110      评论:0      收藏:0      [点我收藏+]

题意:

定义一种特殊的加法,这种加法没有进位,其他与普通加法一样,比如16+16=212。

给出一个数,询问这个数可能被哪两个数用特殊加法构成,并且每次询问修改这个数数位上的一个数字,输出更新后的答案。

题解:

看了橙名大佬的代码才知道是线段树维护矩阵乘法,涨姿势了,%%%%%%%

//线段树维护矩阵乘法 
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+100;
const int mod=998244353;
typedef long long ll;
struct node {
    ll sum[2][2];
    int l,r;
}segTree[maxn*4];
void update (int x) {
    segTree[x].l=segTree[x<<1].l;
    segTree[x].r=segTree[x<<1|1].r;
    for (int i=0;i<2;i++)
        for (int j=0;j<2;j++) {
            segTree[x].sum[i][j]=segTree[x<<1].sum[i][1]*segTree[x<<1|1].sum[1][j]%mod;
            int y=segTree[x<<1].r*10+segTree[x<<1|1].l;
            if (y>=10&&y<=18) {
                segTree[x].sum[i][j]+=segTree[x<<1].sum[i][0]*segTree[x<<1|1].sum[0][j]%mod*(9-(y-9)+1)%mod;
                if (segTree[x].sum[i][j]>=mod) segTree[i].sum[i][j]%=mod; 
            }
        }
}
ll a[maxn];
void build (int x,int l,int r) {
    if (l==r) {
        segTree[x].l=segTree[x].r=a[l];
        segTree[x].sum[1][1]=segTree[x].l+1;
        segTree[x].sum[0][0]=0;
        segTree[x].sum[0][1]=segTree[x].sum[1][0]=1;
        return;
    }
    int mid=(l+r)>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    update(x);
} 
void modify (int x,int l,int r,int pos,int d) {
    if (l==r) {
        segTree[x].l=segTree[x].r=d;
        segTree[x].sum[1][1]=segTree[x].l+1;
        segTree[x].sum[0][0]=0;
        segTree[x].sum[0][1]=segTree[x].sum[1][0]=1;
        return;
    }
    int mid=(l+r)>>1;
    if (mid>=pos)
        modify(x<<1,l,mid,pos,d);
    else
        modify(x<<1|1,mid+1,r,pos,d);
    update(x);
}
int n,m,x,y;
string s;
int main () {
    scanf("%d%d",&n,&m);
    cin>>s;
    for (int i=0;i<s.length();i++) a[i+1]=s[i]-0;
    build(1,1,n);
    while (m--) {
        scanf("%d%d",&x,&y);
        modify(1,1,n,x,y);
        printf("%lld\n",segTree[1].sum[1][1]);
    }
}

 

CF1380F.Strange Addition(线段树维护矩阵乘法)

原文:https://www.cnblogs.com/zhanglichen/p/13337174.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!