蒟蒻30pts求调(玄关
查看原帖
蒟蒻30pts求调(玄关
1423269
ini_____楼主2024/11/19 22:31

p7077函数调用

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,mod=998244353;
int a[N],con[N];
int p[N],v[N],t[N];
int cnt[N],f[N],dp[N],mem[N],carr[N],degr[N];
vector<int> c[N];
void DP(int x){
//	cout<<x<<" ";
	if(mem[x])return;
	mem[x]=1;
	dp[x]=1;
	if(t[x]==1)return;
	if(t[x]==2){
		dp[x]=v[x];
		return;
	}
	for(int i=0;i<cnt[x];i++){
		DP(c[x][i]);
		dp[x]=(dp[x]*dp[c[x][i]])%mod;
	}
	return;
}
void cary(int x){
//	cout<<x<<" "<<carr[x]<<endl;
	if(carr[x]==0)return;
	if(t[x]==2)return;
	if(t[x]==1){
		con[p[x]]=(con[p[x]]+v[x]*carr[x])%mod; 
		carr[x]=0;
		return;
	}
	long long vv=1;
	
	for(int i=cnt[x]-1;i>=0;i--){
		carr[c[x][i]]+=vv*carr[x];
		carr[c[x][i]]%=mod;
		degr[c[x][i]]--;
		if(degr[c[x][i]]==0)cary(c[x][i]);
		vv*=dp[c[x][i]];
		vv%=mod;
	}
	carr[x]=0;
	return;
}
signed main(){
	int n,m,q;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>t[i];
		if(t[i]==1)cin>>p[i]>>v[i];
		if(t[i]==2)cin>>v[i];
		if(t[i]==3){
			cin>>cnt[i];
			for(int j=0;j<cnt[i];j++){
				int ty;
				cin>>ty;
				c[i].push_back(ty);
				degr[ty]++;
			}
		}
	}
	cin>>q;
	for(int i=1;i<=q;i++)cin>>f[i];
	for(int i=1;i<=m;i++)DP(i);
	int V=1;
	for(int i=q;i>=1;i--){
		carr[f[i]]+=V;
		V*=dp[f[i]];
		V%=mod;
	}
	for(int i=1;i<=m;i++){
		if(degr[i]==0)cary(i);
	}
	for(int i=1;i<=n;i++){
		con[i]+=a[i]*V;	
		con[i]%=mod;
		cout<<con[i]<<" ";
	}
	return 0;
}
2024/11/19 22:31
加载中...