社区讨论
TLE80
P7453[THUSC 2017] 大魔法师参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m5926kfo
- 此快照首次捕获于
- 2024/12/29 11:36 去年
- 此快照最后确认于
- 2025/11/04 12:12 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=2.5e5+1;
const int MOD=998244353;
int a[N],b[N],c[N];
struct Matrix{
int a[4][4];
void Init(){
memset(a,0,sizeof(a));
for(int i=0;i<4;i++) a[i][i]=1;
}
int* operator[](int x){return a[x];}
};
int add(int x){return x>MOD?x-MOD:x;}
Matrix operator +(Matrix &A,Matrix &B){
Matrix C;
for(int i=0;i<4;i++) for(int j=0;j<4;j++) C[i][j]=add(A[i][j]+B[i][j]);
return C;
}
Matrix operator *(Matrix &A,Matrix &B){
Matrix C;
for(int i=0;i<4;i++) for(int j=0;j<4;j++) C[i][j]=0;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
C[i][j]=add((C[i][j]+(long long)A[i][0]*B[0][j]%MOD));
C[i][j]=add((C[i][j]+(long long)A[i][1]*B[1][j]%MOD));
C[i][j]=add((C[i][j]+(long long)A[i][2]*B[2][j]%MOD));
C[i][j]=add((C[i][j]+(long long)A[i][3]*B[3][j]%MOD));
}
}
return C;
}
struct Data{
int ise;
Matrix sum,lz;
};
template<const int SIZ>
struct Seg{
#define ls (x<<1)
#define rs (x<<1|1)
#define dat tr[x].data
#define ld tr[ls].data
#define rd tr[rs].data
struct Node{
Data data;
}tr[N<<2];
Data Merge(Data x,Data y){
if(x.ise) return y;
if(y.ise) return x;
Matrix lz;lz.Init();
return (Data){0,x.sum+y.sum,lz};
}
void PushDown(int x){
ld.sum=ld.sum*dat.lz;
rd.sum=rd.sum*dat.lz;
ld.lz=ld.lz*dat.lz;
rd.lz=rd.lz*dat.lz;
dat.lz.Init();
return ;
}
void Build(int x,int l,int r){
if(l==r){
for(int i=0;i<4;i++) for(int j=0;j<4;j++) dat.sum[i][j]=0;
dat.sum[0][0]=a[l];
dat.sum[0][1]=b[l];
dat.sum[0][2]=c[l];
dat.sum[0][3]=1;
dat.lz.Init();
return ;
}
int mid=(l+r)>>1;
Build(ls,l,mid);
Build(rs,mid+1,r);
dat=Merge(ld,rd);
}
void Mul(int x,int L,int R,Matrix &k,int l,int r){
if(l>R||r<L) return ;
if(L<=l&&r<=R){
dat.sum=dat.sum*k;
dat.lz=dat.lz*k;
return ;
}
PushDown(x);
int mid=l+r>>1;
Mul(ls,L,R,k,l,mid);
Mul(rs,L,R,k,mid+1,r);
dat=Merge(ld,rd);
}
Data Ask(int x,int L,int R,int l,int r){
Data ans;ans.ise=1;
if(l>R||r<L) return ans;
if(L<=l&&r<=R) return dat;
PushDown(x);
int mid=l+r>>1;
return Merge(Ask(ls,L,R,l,mid),Ask(rs,L,R,mid+1,r));
}
};
Seg<N> seg;
Matrix mul[7];
template <class T>
inline void read(T &a) {
register char c;while (c = getchar(), (c < '0' || c > '9') && c != '-');register bool f = c == '-';register T x = f ? 0 : c - '0';while (c = getchar(), c >= '0' && c <= '9') {x = (x << 3) + (x << 1) + (c ^ 48);}a = f ? -x : x;
}
signed main()
{
// freopen("magician.in","r",stdin);
// freopen("magician.out","w",stdout);
read(n);
for(int i=1;i<=n;i++) read(a[i]),read(b[i]),read(c[i]);
seg.Build(1,1,n);
read(m);
for(int i=1;i<=6;i++) mul[i].Init();
mul[1][1][0]=mul[2][2][1]=mul[3][0][2]=1;
mul[6][2][2]=0;
while(m--){
int op,l,r,v;
read(op),read(l),read(r);
if(op<=3) seg.Mul(1,l,r,mul[op],1,n);
else if(op<=6){
read(v);
mul[4][3][0]=mul[5][1][1]=mul[6][3][2]=v;
seg.Mul(1,l,r,mul[op],1,n);
}
else{
Data ans=seg.Ask(1,l,r,1,n);
printf("%d %d %d\n",ans.sum[0][0],ans.sum[0][1],ans.sum[0][2]);
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...