30pts球调
查看原帖
30pts球调
1296840
zhang_fengrui楼主2024/3/30 17:47
#include <cstdio>
#include <queue>
#define int long long
#define mod 998244353
using namespace std;
int n,m;
int a[100005];
struct Edge{
	int next;
	int to;
}es[1000005],es1[1000005];
int head[100005],cnt;
int head1[100005],cnt1;
int in[100005];
int in1[100005],in2[100005];
int cs[100005];
void add(int u,int v){
	es[cnt].next=head[u];
	es[cnt].to=v;
	in[v]++;
	head[u]=cnt;
	cnt++;
}
void add1(int u,int v){
	es1[cnt1].next=head1[u];
	es1[cnt1].to=v;
	in2[v]++;
	head1[u]=cnt1;
	cnt1++;
}
int hmul[100005];
pair<int,int> hplu[100005];
int mul[100005];
void tuopu1(){
	queue<int> q;
	for(int i=1;i<=m+1;i++){
		in1[i]=in[i];
		if(in1[i]==0){
			q.push(i);
		}
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		mul[u]*=hmul[u];
		mul[u]%=mod;
		//printf("u:%d mul[u]:%d\n",u,mul[u]);
		for(int i=head[u];i;i=es[i].next){
			int v=es[i].to;
			mul[v]*=mul[u];
			mul[v]%=mod;
			in1[v]--;
			if(in1[v]==0){
				q.push(v);
			}
		}
	}
}
void tuopu2(){
	queue<int> q;
	for(int i=1;i<=m+1;i++){
		in1[i]=in2[i];
		if(in1[i]==0){
			cs[i]++;
			q.push(i);
		}
	}
	while(!q.empty()){
		int u=q.front();
		//printf("u:%d cs[u]:%d\n",u,cs[u]);
		q.pop();
		int now_mul=1;
		for(int i=head1[u];i;i=es1[i].next){
			int v=es1[i].to;
			in1[v]--;
			cs[v]= (cs[v]+cs[u]*now_mul)%mod;
			cs[v]%=mod;
			now_mul*=mul[v];
			now_mul%=mod;
			//printf("v:%d in1[v]:%d\n",v,in1[v]);
			if(in1[v]==0){
				q.push(v);
			}
		}
	}
}
signed main(){
    mul[0] = 1;
	cnt=1;
	cnt1=1;
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	scanf("%lld",&m);
	for(int i=1;i<=m;i++){
		hmul[i]=1;
		mul[i]=1;
		int t;
		scanf("%lld",&t);
		if(t==1){
			int p,v;
			scanf("%lld%lld",&p,&v);
			hplu[i].first=p;
			hplu[i].second=v;
		}
		else if(t==2){
			int v;
			scanf("%lld",&v);
			hmul[i]=v;
		}
		else{
			int c;
			scanf("%lld",&c);
			for(int j=1;j<=c;j++){
				int u;
				scanf("%lld",&u);
				add(u,i);
				add1(i,u);
			}
		}
	}
	hmul[m+1]=1;
	mul[m+1]=1;
	int Q;
	scanf("%lld",&Q);
	for(int j=1;j<=Q;j++){
		int u;
		scanf("%lld",&u);
		add(u,m+1);
		add1(m+1,u);
	}
	tuopu1();
	tuopu2();
	//printf("mul[m+1]:%d\n",mul[m+1]);
	for(int i=1;i<=n;i++){
		a[i]*=mul[m+1];
		a[i]%=mod;
	}
	for(int i=1;i<=m;i++){
		//printf("i:%d cs[i]:%d\n",i,cs[i]);
		a[hplu[i].first]= (a[hplu[i].first]+cs[i]*hplu[i].second)%mod;
		a[hplu[i].first]%=mod;
	}
	for(int i=1;i<=n;i++){
		printf("%lld ",a[i]);
	}
	return 0;
}
2024/3/30 17:47
加载中...