真晕了,有没有大佬帮看一下为什么超时啊

F题

#include<bits/stdc++.h>
#define ls 2*i
#define rs 2*i+1
using namespace std;
const int mod=998244353;
const int N=210011;
int v[N];
array<int,7>tree[N<<2];
bool flag[N<<2];


struct mt{
    int a[7][7]={0};
    mt(){}
    void fc(){
        for(int i=0;i<7;i++)for(int j=0;j<7;j++){
            a[i][j]=(i==j);
        }
    }
    mt(int op,int tk){
        vector<int>x(6);
        x[0]=1;
        for(int i=1;i<6;i++){
            x[i]=x[i-1]*tk%mod;
        }
        if(op==1){//加
            int tp[7][7]={
                {1,x[1],x[2],x[3],x[4],x[5],0},
                {0,1,2*x[1],3*x[2],4*x[3],5*x[4],0},
                {0,0,1,3*x[1],6*x[2],10*x[3],0},
                {0,0,0,1,4*x[1],10*x[2],0},
                {0,0,0,0,1,5*x[1],0},
                {0,0,0,0,0,1,0},
                {0,0,0,0,0,0,1}
            };
            for(int i=0;i<7;i++)for(int j=0;j<7;j++){
                a[i][j]=tp[i][j];
            }
        }else if(op==2){//乘
            for(int i=0;i<6;i++){
                a[i][i]=x[i];
            }
            a[6][6]=1;
        }else if(op==3){
            for(int i=0;i<7;i++){
                a[i][i]=1;
            }
            for(int i=1;i<7;i++){
                a[i][6]=1;
            }
        }
    }
    mt operator *(const mt& b)const{
        mt ans;
        for(int i=0;i<7;i++)for(int j=0;j<7;j++){
            for(int k=0;k<7;k++){
               ans.a[i][j]+=1ll*a[i][k]*b.a[k][j]%mod;
               ans.a[i][j]%=mod; 
            }
        }
        return ans;
    }
}tag[N<<2];
array<int,7>cheng(array<int,7>&a,mt& b){
    array<int,7>ans={0};
    for(int i=0;i<7;i++){
        for(int j=0;j<7;j++){
            ans[i]+=1ll*a[j]*b.a[j][i]%mod;
            ans[i]%=mod;
        }
    }
    return ans;
}
void build(int l,int r,int i){
    tag[i].fc();
    if(l==r){
        int tp=v[l];int val=1;
        for(int j=0;j<=5;j++){
            tree[i][j]=val;
            val=1ll*val*tp%mod;
        }
        tree[i][6]=0;
    }else{
        int mid=(l+r)/2;
        build(l,mid,ls);
        build(mid+1,r,rs);
    }
}
void lazy(int i,mt& tp){
    flag[i]=1;
    tag[i]=tag[i]*tp;
    tree[i]=cheng(tree[i],tp);
}
void down(int i){
    if(flag[i]){
        lazy(ls,tag[i]);
        lazy(rs,tag[i]);
        tag[i].fc();
        flag[i]=0;
    }
}
void add(int tl,int tr,mt&tp,int l,int r,int i){
    if(tl<=l&&r<=tr){
        lazy(i,tp);
    }else{
        int mid=(l+r)/2;
        down(i);
        if(mid>=tl)
        add(tl,tr,tp,l,mid,ls);
        if(mid<tr)
        add(tl,tr,tp,mid+1,r,rs);
    }
}
void query(int l,int r,int i){
    if(l==r){
        cout<<tree[i][6]<<" ";
    }else{
        int mid=(l+r)/2;
        down(i);
        query(l,mid,ls);
        query(mid+1,r,rs);
    }
}
signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i];
    }
    build(1,n,1);
    mt nm(3,0);
    while(m--){
        int op,l,r,x;cin>>op>>l>>r>>x;
        mt tp(op,x);
        if(op==1){
            add(l,r,tp,1,n,1);
        }else {
            add(l,r,tp,1,n,1);
        }
        add(1,n,nm,1,n,1);
    }
    query(1,n,1);
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务