求助 40(有注释)
查看原帖
求助 40(有注释)
1351126
General0826楼主2024/10/22 19:05
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=5e5+5,P=998244353;
struct dian{
	ll num,x,w;
}sxf[N];
ll l,r,m,n,op,x,w;
ll lu[N],a[N],que[N],sum[N],cs[N],yux[N],mt[N],inc[N],inf[N],k,qj; 
vector<ll> c[N],f[N];
ll q_pow(ll a,ll b){ //快速幂 T
	ll num=a,cnt=1,op=b;
	return a;
	while(b){
		if(b&1) cnt=1ll*(cnt*num)%P;
		num=1ll*(num*num)%P;
		b>>=1;
	}
}
void tfort(vector<ll> c[],ll inc[]){  //T
	l=1,r=0;
	for(ll i=1;i<=m;i++){
		sum[i]=sxf[i].num;
		if(inc[i]==0){
			que[++r]=i;
		}
	}
	//将一个函数的基本贡献算上 T
	
	while(l<=r){
		ll v=que[l];
		for(auto i:c[v]){
			if(inc[i]!=0){
				--inc[i];
				sum[i]=(sum[v]*sum[i])%P;
				//转移 
				if(inc[i]==0){
					que[++r]=i;
				}	
			}
		}
		l++;
	}
} 
void topsort(ll inc[]){

	memset(cs,0,sizeof(cs));
	l=1,r=1;
	que[1]=m+1; 
	cs[m+1]=sum[m+1]=1; // 将m+1加入 
	
	
	while(l<=r){
		ll v=que[l],mk=cs[v];


		lu[sxf[v].x]=(lu[sxf[v].x]+(sxf[v].w*cs[v])%P)%P;
		//将对单点的贡献算上 
		
		for(ll i=(ll)(c[v].size())-1;i>=0;i--){
			ll nxt=c[v][i];
			if(inc[nxt]!=0){
//			
				inc[nxt]--;
				if(inc[nxt]==0){
					que[++r]=nxt;
				}  //top部分 
				
				
	//				yux[nxt]+=yux[v]; //将使用次数加上 
				
				cs[nxt]=(cs[nxt]+mk)%P;//将后缀乘加上 
				
				mk=(mk*sum[nxt])%P; 
				//算出 他对后缀乘的贡献 
				
				
			}
			}
			
			
		if(l==1) //全局贡献 
			qj=mk;
		l++;
		
	}
}
int main(){

	cin>>n;
	for(ll i=1;i<=n;i++)
		cin>>a[i];
	cin>>m;
	for(ll i=1;i<=m;i++){
		cin>>op;
		if(op==1){
			cin>>x>>w;
			sxf[i]=(dian){1,x,w};
		}
		else if(op==2){
			cin>>w;
			sxf[i]=(dian){w,0,0};
		} 
		else{
			cin>>x;
			sxf[i]=(dian){1,0,0};
			for(ll j=1;j<=x;j++){
				cin>>w;
				c[i].emplace_back(w); //正边
				inc[w]++;
				f[w].emplace_back(i); //反边 
				inf[i]++;	
			}
		}
	}
	// 输入 
	
	
	tfort(f,inf);
	
	//反向top,算出每个函数对积的贡献 
	
	cin>>k;
	for(ll i=1;i<=k;i++){
		cin>>x;
		c[m+1].emplace_back(x);
		inc[x]++;
	}
	//输入,并建边将m+1(main)当做一个函数处理 
	
	
	
	
//	for(lli=0;i<=m;i++){
//		cout<<'^'<<i<<' '<<sum[i]<<'\n';
//		for(llj=0	;j<c[i].size();j++){
//			cout<<c[i][j]<<' ';
//		}cout<<'\n';
//	}

	topsort(inc);
	
	//处理 
	
	for(ll i=1;i<=n;i++){
		cout<<(a[i]*qj%P+lu[i])%P<<' ';
	} 
	//输出 
	return 0;    
}	
	
//		cout<<v<<' '<<sum[v]<<'\n';
//		cout<<v<<' '<<yux[v]<<' '<<cs[v]<<'\n'; 
//				if(sxf[v].w *cs[v]*yux[v]!=0){
//					cout<<sxf[v].w *cs[v]*yux[v]<<" "<<sxf[v].x<<'\n';
//				}  
/*

*/
2024/10/22 19:05
加载中...