真晕了,有没有大佬帮看一下为什么超时啊
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); }