45pts TLE 求卡常,悬赏8关注
查看原帖
45pts TLE 求卡常,悬赏8关注
529038
Butterfly__qwq楼主2023/10/6 20:47
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n,m;
struct matrix
{
	int c[4][4];
	matrix(int a[4][4])
	{
		for(int i=0;i<4;i++)for(int j=0;j<4;j++)c[i][j]=a[i][j];
	}
	matrix()
	{
		memset(c,0,sizeof(c));
	}
	inline void operator=(matrix p)
	{
		for(int i=0;i<4;i++)for(int j=0;j<4;j++)c[i][j]=p.c[i][j];
	}
	inline matrix operator+(matrix p)
	{
		matrix q;
		for(int i=0;i<4;i++)for(int j=0;j<4;j++)q.c[i][j]=(c[i][j]+p.c[i][j])%mod;
		return q;
	}
	inline matrix operator*(matrix p)
	{
		matrix q;
		for(int i=0;i<4;i++)for(int j=0;j<4;j++)q.c[i][j]=0;
		for(int i=0;i<4;i++)for(int j=0;j<4;j++)
		{
			(q.c[i][j]+=1ll*c[i][0]*p.c[0][j]%mod)%=mod;
			(q.c[i][j]+=1ll*c[i][1]*p.c[1][j]%mod)%=mod;
			(q.c[i][j]+=1ll*c[i][2]*p.c[2][j]%mod)%=mod;
			(q.c[i][j]+=1ll*c[i][3]*p.c[3][j]%mod)%=mod;
		}
		return q;
	}
}a[250005];
int I_I[4][4]={{1,0,0,0},
               {0,1,0,0},
               {0,0,1,0},
               {0,0,0,1}};
matrix I(I_I);
int A_A[4][4]={{1,0,0,0},
               {1,1,0,0},
               {0,0,1,0},
               {0,0,0,1}};
matrix A(A_A);
int B_B[4][4]={{1,0,0,0},
               {0,1,0,0},
               {0,1,1,0},
               {0,0,0,1}};
matrix B(B_B);
int C_C[4][4]={{1,0,1,0},
               {0,1,0,0},
               {0,0,1,0},
               {0,0,0,1}};;
matrix C(C_C);
int D_D[4][4]={{1,0,0,0},
               {0,1,0,0},
               {0,0,1,0},
               {2,0,0,1}};
matrix D(D_D);
int E_E[4][4]={{1,0,0,0},
               {0,2,0,0},
               {0,0,1,0},
               {0,0,0,1}};
matrix E(E_E);
int F_F[4][4]={{1,0,0,0},
               {0,1,0,0},
               {0,0,0,0},
               {0,0,2,1}};
matrix F(F_F);
struct node
{
	matrix sum,lazy;
}sg[1000005];
inline void pushup(int u)
{
	sg[u].sum=sg[u<<1].sum+sg[u<<1|1].sum;
}
inline void pushlazy(int u,matrix lz)
{
	sg[u].sum=sg[u].sum*lz;
	sg[u].lazy=sg[u].lazy*lz;
}
inline void pushdown(int u)
{
	pushlazy(u<<1,sg[u].lazy);
	pushlazy(u<<1|1,sg[u].lazy);
	sg[u].lazy=I;
}
inline void build(int u,int l,int r)
{
	sg[u].lazy=I;
	if(l==r)
	{
		sg[u].sum=a[l];
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
inline void update(int u,int l,int r,int L,int R,matrix w)
{
	if(L<=l&&r<=R)
	{
		pushlazy(u,w);
		return;
	}
	pushdown(u);
	int mid=l+r>>1;
	if(L<=mid)update(u<<1,l,mid,L,R,w);
	if(R>mid)update(u<<1|1,mid+1,r,L,R,w);
	pushup(u);
}
inline matrix query(int u,int l,int r,int L,int R)
{
	if(L<=l&&r<=R)return sg[u].sum;
	pushdown(u);
	int mid=l+r>>1;
	matrix ans;
	memset(ans.c,0,sizeof(ans.c));
	if(L<=mid)ans=ans+query(u<<1,l,mid,L,R);
	if(R>mid)ans=ans+query(u<<1|1,mid+1,r,L,R);
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].c[0][0]>>a[i].c[0][1]>>a[i].c[0][2];
		a[i].c[0][3]=1;
	}
	build(1,1,n);
	cin>>m;
	while(m--)
	{
		int op,l,r,v;
		cin>>op>>l>>r;
		if(op==1)update(1,1,n,l,r,A);
		if(op==2)update(1,1,n,l,r,B);
		if(op==3)update(1,1,n,l,r,C);
		if(op==4)
		{
			cin>>v;
			D.c[3][0]=v;
			update(1,1,n,l,r,D);
		}
		if(op==5)
		{
			cin>>v;
			E.c[1][1]=v;
			update(1,1,n,l,r,E);
		}
		if(op==6)
		{
			cin>>v;
			F.c[3][2]=v;
			update(1,1,n,l,r,F);
		}
		if(op==7)
		{
			matrix ans=query(1,1,n,l,r);
			cout<<ans.c[0][0]<<' '<<ans.c[0][1]<<' '<<ans.c[0][2]<<'\n';
		}
	}
}

已经开O2了

2023/10/6 20:47
加载中...