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

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);
}


全部评论
此外别写矩阵构造函数,写普通函数然后调用
点赞 回复 分享
发布于 02-23 19:21 江西
结束了,测评机突然发威了
点赞 回复 分享
发布于 02-23 19:17 江西

相关推荐

今天 18:43
门头沟学院 Java
是暑期都招满了吗
投递腾讯等公司7个岗位
点赞 评论 收藏
分享
07-11 22:27
中南大学 Java
程序员牛肉:学历的话没问题。但是没问题的也就只有学历了。 其实你的整体架构是正确的,博客接着干。但是项目有点过于简单了。从后端的角度上讲,你这也就是刚入门的水平,所以肯定约面试够呛。 如果你要应聘后端岗位,那你第一个项目竟然是仿写操作系统。这个你要面试官咋问你。你一定要记住一点,你简历上写的所有的东西,都是为了证明你有能力胜任当前的岗位,而不是为了证明你自己会什么。 如果你只是浅浅的做几个项目,描述也都是烂大街。技术点也都是各种混水类的配置类需求,那你就不要幻想自己能走多远。一定要保持思考,保持学习。
点赞 评论 收藏
分享
07-01 23:23
郑州大学 Java
否极泰来来来来:牛客迟早有高三的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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