社区讨论

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 条回复,欢迎继续交流。

正在加载回复...