P7453 大魔法师TLE20分求调
  • 板块学术版
  • 楼主zyxawa
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/11/17 17:27
  • 上次更新2023/10/27 02:38:59
查看原帖
P7453 大魔法师TLE20分求调
673294
zyxawa楼主2022/11/17 17:27
#include<bits/stdc++.h>
using namespace std;
int n,m,op,v,q1,q2,mod=998244353;
struct matrix{
	int m[5][5];
	matrix(){
		memset(m,0,sizeof(m));
	}
	matrix operator+(const matrix &a)const{
		matrix b;
		for(int i=0;i<=3;i++){
			for(int j=0;j<=3;j++) b.m[i][j]=(m[i][j]+a.m[i][j])%mod;
		}
		return b;
	}
	matrix operator*(const matrix &a)const{
		matrix b;
		for(int i=0;i<=3;i++){
			for(int j=0;j<=3;j++){
				for(int k=0;k<=3;k++) b.m[i][j]=(b.m[i][j]+1ll*m[i][k]*a.m[k][j]%mod)%mod;
			}
		}
		return b;
	}
}a[250001],node[1000001],lazy[1000001],dp[7];
void build(int rt,int l,int r){
	lazy[rt].m[0][0]=lazy[rt].m[1][1]=lazy[rt].m[2][2]=lazy[rt].m[3][3]=1;
	if(l==r){
		node[rt]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(rt*2,l,mid);
	build(rt*2+1,mid+1,r);
	node[rt]=node[rt*2]+node[rt*2+1];
}
void push_down(int rt){
	node[rt*2]=node[rt*2]*lazy[rt];
	node[rt*2+1]=node[rt*2+1]*lazy[rt];
	lazy[rt*2]=lazy[rt*2]*lazy[rt];
	lazy[rt*2+1]=lazy[rt*2+1]*lazy[rt];
	memset(lazy[rt].m,0,sizeof(lazy[rt].m));
	lazy[rt].m[0][0]=lazy[rt].m[1][1]=lazy[rt].m[2][2]=lazy[rt].m[3][3]=1;
}
void updata(int rt,int l,int r,int L,int R,matrix val){
	if(L<=l&&r<=R){
		node[rt]=node[rt]*val;
		lazy[rt]=lazy[rt]*val;
		return;
	}
	push_down(rt);
	int mid=(l+r)>>1;
	if(L<=mid) updata(rt*2,l,mid,L,R,val);
	if(mid+1<=R) updata(rt*2+1,mid+1,r,L,R,val);
	node[rt]=node[rt*2]+node[rt*2+1];
}
matrix query(int rt,int l,int r,int L,int R){
	if(L<=l&&r<=R) return node[rt];
	push_down(rt);
	int mid=(l+r)>>1;
	matrix res;
	if(L<=mid) res=res+query(rt*2,l,mid,L,R);
	if(mid+1<=R) res=res+query(rt*2+1,mid+1,r,L,R);
	return res;
}
int main(){
	dp[1].m[0][0]=dp[1].m[1][0]=dp[1].m[1][1]=dp[1].m[2][2]=dp[1].m[3][3]=1;
	dp[2].m[0][0]=dp[2].m[1][1]=dp[2].m[2][1]=dp[2].m[2][2]=dp[2].m[3][3]=1;
	dp[3].m[0][0]=dp[3].m[0][2]=dp[3].m[1][1]=dp[3].m[2][2]=dp[3].m[3][3]=1;
	dp[4].m[0][0]=dp[4].m[1][1]=dp[4].m[2][2]=dp[4].m[3][3]=1;
	dp[5].m[0][0]=dp[5].m[2][2]=dp[5].m[3][3]=1;
	dp[6].m[0][0]=dp[6].m[1][1]=dp[6].m[3][3]=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&a[i].m[0][0],&a[i].m[0][1],&a[i].m[0][2]);
		a[i].m[0][3]=1;
	}
	build(1,1,n);
	scanf("%d",&m);
	while(m--){
		scanf("%d%d%d",&op,&q1,&q2);
		if(op>=4&&op<=6) scanf("%d",&v);
		if(op==4) dp[4].m[3][0]=v;
		if(op==5) dp[5].m[1][1]=v;
		if(op==6) dp[6].m[3][2]=v;
		if(op==7){
			matrix ans=query(1,1,n,q1,q2);
			printf("%d %d %d\n",ans.m[0][0],ans.m[0][1],ans.m[0][2]);
		}
		else updata(1,1,n,q1,q2,dp[op]);
	}
	return 0;
}
2022/11/17 17:27
加载中...