社区讨论

55分求助

P7077[CSP-S 2020] 函数调用参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@locjig47
此快照首次捕获于
2023/10/30 14:49
2 年前
此快照最后确认于
2023/11/05 02:07
2 年前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const ll mod=998244353;
int n,m,Q,C,TOT,X;
ll a[maxn],in1[maxn],in2[maxn];
struct change{
	int op,pos,val;
	ll mul,add;
}func[maxn];
vector<int> v1[maxn],v2[maxn];
void topo1(){
	queue<int> q;
	for(int i=0;i<=m;i++){
		in1[i]=v2[i].size();
		if(!v2[i].size()){
			q.push(i);
		}
	}
	while(q.size()){
		int now=q.front();
		q.pop();
		for(int i=0;i<v1[now].size();i++){
			in1[v1[now][i]]--;
			func[v1[now][i]].mul*=func[now].mul;
			func[v1[now][i]].mul%=mod;
			if(!in1[v1[now][i]])
				q.push(v1[now][i]);
		}
	}
	return ;
}
void topo2(){
	queue<int> q;
	for(int i=0;i<=m;i++){
		in2[i]=v1[i].size();
		if(!in2[i])
			q.push(i);
	}
	while(q.size()){
		int now=q.front();
		q.pop();
		ll now_mul=1;
		for(int i=v2[now].size()-1;i>=0;i--){
			in2[v2[now][i]]--;
			func[v2[now][i]].add+=func[now].add*now_mul;
			func[v2[now][i]].add%=mod;
			now_mul*=func[v2[now][i]].mul;
			now_mul%=mod;
			if(!in2[v2[now][i]])
				q.push(v2[now][i]);
		}
	}
	return ;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d",&func[i].op);
		if(func[i].op==1){
			scanf("%d%d",&func[i].pos,&func[i].val);
			func[i].mul=1;
		}
		if(func[i].op==2)
			scanf("%lld",&func[i].mul);
		if(func[i].op==3){
			scanf("%d",&TOT);
			func[i].mul=1;
			for(int j=1;j<=TOT;j++){
				scanf("%d",&C);
				v1[C].push_back(i);
				v2[i].push_back(C);
			}
		}
	}
	scanf("%d",&Q);
	for(int i=1;i<=Q;i++){
		scanf("%d",&X);
		v1[X].push_back(0);
		v2[0].push_back(X);
	}
	func[0].mul=1;
	func[0].add=1;
	topo1();
	topo2();
	for(int i=1;i<=m;i++){
		a[i]*=func[0].mul;
		a[i]%=mod;
	}
	for(int i=1;i<=m;i++)
		if(func[i].op==1){
			a[func[i].pos]+=func[i].add*func[i].val;
			a[func[i].pos]%=mod;
		}
	for(int i=1;i<=n;i++)
		printf("%lld ",a[i]);
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...