我打了20分的暴力,为什么爆零了啊啊啊,我要完了
查看原帖
我打了20分的暴力,为什么爆零了啊啊啊,我要完了
55227
魂逝_秦月歌楼主2020/11/9 18:05
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cctype>
#include <algorithm>
#define _e putchar (' ')
#define _v putchar ('\n')
#define ll long long
#define File(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std;
inline int mx (int x,int y) {
	return x>y?x:y;
}
inline int mn(int x,int y) {
	return x<y?x:y;
}
inline void r(int &x) {
	int s=0,w=1;
	char ch=getchar ();
	while (ch>'9'||ch<'0') {if(ch=='-')  w=-1; ch=getchar ();}
	while (ch>='0'&&ch<='9') {s=(s<<1)+(s<<3)+(ch^48); ch=getchar ();}
	x=s*w;
}
inline void wr (int x) {
	if(x<0) x=-x,putchar (45);
	if(x<10) {
		putchar (x+48);
		return ;
	}
	wr(x/10);
	putchar (x%10+48);
}
const int N=100005,mod=998244353;
int n,m,k,q,sum[N],id,a[N],b[N][5];
struct node {
	int s,lazy;
}tree[N*4];
inline void pushup (int u) {
	tree[u].s=tree[u<<1].s+tree[u<<1|1].s;
}
inline void build (int lt,int rt,int u) {
	tree[u].lazy=1;
	if(lt==rt) {
		a[++id]=u;
		r(tree[u].s);
	}
	int mid=(lt+rt)>>1;
	build (lt,mid,u<<1);
	build (mid+1,rt,u<<1|1);
}
inline void pushdown (int lt,int rt,int u) {
	if(lt==rt||tree[u].lazy==1) return ;
	tree[u<<1].lazy*=tree[u].lazy%mod;
	tree[u<<1|1].lazy*=tree[u].lazy%mod;
	int mid=(lt+rt)>>1;
	tree[u<<1].s*=(mid-lt+1)*tree[u].lazy%mod;
	tree[u<<1|1].s*=(rt-mid)*tree[u].lazy%mod;
	tree[u].lazy=1;
}
inline void update (int nowl,int nowr,int delta,int tarl,int tarr,int u){
	if(nowl>=tarl&&nowr<=tarr) {
		tree[u].lazy*=delta%mod;
		tree[u].s*=(nowr-nowl+1)*delta%mod;
		return ;
	}
	pushdown (nowl,nowr,u);
	int mid=(nowl+nowr)>>1;
	if(nowl<=mid) update(nowl,mid,delta,tarl,tarr,u<<1);
	if(nowr>mid) update(mid+1,nowr,delta,tarl,tarr,u<<1|1);
	pushup(u);
}
inline void work(int q) {
	if(b[q][1]==1){
		a[b[q][2]]=(a[b[q][2]]+b[q][3])%mod;
		return ;
	}
	if(b[q][1]==2) {
		for(int j=1;j<=n;j++)
			a[j]=(a[j]*b[q][2])%mod;
		return ;
	}
	if(b[q][1]==3)
		for(int i=3;i<=b[q][2]+2;i++)
			work(b[q][i]);
}
int main () {
	File("call");
	r(n);
	for(int i=1;i<=n;i++)
		r(a[i]);
	r(m);
	for(int i=1;i<=m;i++) {
		r(b[i][1]);
		if(b[i][1]==1) r(b[i][2]),r(b[i][3]);
		if(b[i][1]==2) r(b[i][2]);
		if(b[i][1]==3) {
			r(b[i][2]);
			for(int j=1;j<=b[i][2];j++)
				r(b[i][j+2]);
		}
	}
	r(k);
	for(int i=1;i<=k;i++) {
		r(q);
		work(q);
	}
	for(int i=1;i<n;i++)
		wr(a[i]%mod),_e;
	wr(a[n]);
	_v;
	return 0;
}
2020/11/9 18:05
加载中...