30 pts 求 hack
查看原帖
30 pts 求 hack
416975
sbno333楼主2024/10/24 22:22
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353ll
#define pii pair<int,int>
int a[1000009];
struct st{
	int v,ne;
	int w;
}sd[2000009];
vector<int> z[100009];
int nn[100009];
int inn;
int h[100009];
void add(int u,int v){
	sd[++inn].v=v;
	sd[inn].ne=h[u];
	h[u]=inn;
}
int cd[100009];
int lx[100009];
int xl[100009];
bool vis[100009]; 
priority_queue<pii,vector<pii>,greater<pii> > q; 
int mj[100009];
int ii;
int dp[100009];
int rd[100009];
void dfs(int t){
	if(lx[t]){
		if(xl[t]){
			a[xl[t]]+=lx[t]*dp[t];
			a[xl[t]]%=mod;
		}
		return;
	}
	for(int i=h[t];i;i=sd[i].ne){
		dp[sd[i].v]+=dp[t]*sd[i].w;
		dp[sd[i].v]%=mod;
		rd[sd[i].v]--;
		if(!rd[sd[i].v]){
			dfs(sd[i].v);
		}
	}
}
signed main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int m;
	cin>>m;
	for(int i=1;i<=m;i++){
		z[i].push_back(0);
	}
	for(int i=1;i<=m;i++){
		int t;
		cin>>t;
		if(t==1){
			int p,c;
			cin>>p>>c;
			xl[i]=p;
			lx[i]=c;
		}else if(t==2){
			int c;
			cin>>c;
			lx[i]=c;
		}else{
			int c;
			cin>>c;
			for(int j=1;j<=c;j++){
				int g;
				cin>>g;
				add(i,g);
				z[g].push_back(0);
				z[g][++nn[g]]=i;
			}
			cd[i]=c;
		}
	}
	for(int i=1;i<=m;i++){
		q.push({cd[i],i});
	}
	while(q.size()){
		int g;
		g=q.top().second;
		q.pop();
		if(vis[g]){
			continue;
		}
		vis[g]=1;
		mj[++ii]=g;
		for(int i=1;i<=nn[g];i++){
			cd[z[g][i]]--;
			q.push({cd[z[g][i]],z[g][i]});
		}
	}
	for(int i=1;i<=ii;i++){
		int t;
		t=1;
		for(int j=h[mj[i]];j;j=sd[j].ne){
			sd[j].w=t;
			if(!xl[sd[j].v])
				t*=dp[sd[j].v];
			t%=mod;
		}
		dp[mj[i]]=t;
		if(lx[mj[i]]&&!xl[mj[i]]){
			dp[mj[i]]=lx[mj[i]];
		}
	}
	int q;
	cin>>q;
	for(int i=1;i<=q;i++){
		int x;
		cin>>x;
		add(m+1,x);
	}
	int t;
	t=1;
	for(int j=h[m+1];j;j=sd[j].ne){
		sd[j].w=t;
		if(!xl[sd[j].v])
			t*=dp[sd[j].v];
		t%=mod;
	}
	dp[m+1]=t;
	if(lx[m+1]&&!xl[m+1]){
		dp[m+1]=lx[m+1];
	}
	for(int i=1;i<=n;i++){
		a[i]*=dp[m+1];
		a[i]%=mod;
	}
	for(int i=1;i<=m+1;i++){
		dp[i]=0;
		for(int j=h[i];j;j=sd[j].ne){
			rd[sd[j].v]++;
		}
	}
	dp[m+1]=1;
	dfs(m+1);
	for(int i=1;i<=n;i++){
		cout<<a[i]<<" ";
	}
	return 0;
} 
2024/10/24 22:22
加载中...