萌新求助
查看原帖
萌新求助
119261
7KByte楼主2020/11/26 16:36

85分,WA了三个点,未知原因。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define int long long
#define N 1000005
#define P 998244353
using namespace std;
int n,m,a[N];
struct node{
	int op,p,v,c,mul;
	node(){mul=~0;}
	vector<int>e,f;
}u[N];
void calc(int x){
	if(~u[x].mul)return;
	u[x].mul=1;
	if(u[x].op==2)u[x].mul=u[x].v;
	if(u[x].op!=3)return;
	rep(i,0,u[x].c-1)calc(u[x].e[i]);
	int now=1;u[x].f.resize(u[x].c+1);
	pre(i,u[x].c-1,0)u[x].f[i]=now,now=now*u[u[x].e[i]].mul%P;
	u[x].mul=now;
}
queue<int>q;
int Pow(int x,int y){
	int now=1; 
	for(;y;y>>=1,x=x*x%P)if(y&1)now=now*x%P;
	return now;
}
int in[N],ed[N],cnt[N],mt=1,ad[N];
void topo(){
	ed[m+1]=cnt[m+1]=1;
	rep(i,1,m+1)if(!in[i])q.push(i);
	while(!q.empty()){
		int x=q.front();q.pop();
		if(u[x].op==1)ad[u[x].p]=(ad[u[x].p]+u[x].v*ed[x])%P;
		if(u[x].op==2)mt=mt*Pow(u[x].v,cnt[x])%P;
		rep(i,0,u[x].c-1){
			in[u[x].e[i]]--;
			if(!in[u[x].e[i]])q.push(u[x].e[i]);
			ed[u[x].e[i]]=(ed[u[x].e[i]]+ed[x]*u[x].f[i])%P;
			cnt[u[x].e[i]]=(cnt[u[x].e[i]]+cnt[x])%P;
		}
	}
}
signed main(){
	freopen("P7077_11.in","r",stdin);
	//freopen("aa.out","w",stdout);
	scanf("%lld",&n);
	rep(i,1,n)scanf("%lld",&a[i]);
	scanf("%lld",&m);
	rep(i,1,m){
		scanf("%lld",&u[i].op);
		if(u[i].op==1)scanf("%lld%lld",&u[i].p,&u[i].v);
		else if(u[i].op==2)scanf("%lld",&u[i].v);
		else {
			scanf("%lld",&u[i].c);
			rep(j,1,u[i].c){
				int x;scanf("%lld",&x);in[x]++;
				u[i].e.push_back(x);
			}
		}
	}
	scanf("%lld",&u[m+1].c);u[m+1].op=3;
	rep(i,1,u[m+1].c){
		int x;scanf("%lld",&x);in[x]++;
		u[m+1].e.push_back(x);
	}
	rep(i,1,m+1)calc(i);
	topo();
	rep(i,1,n)printf("%lld ",(ad[i]+mt*a[i])%P);
	//cout<<mt<<endl;
	//rep(i,1,m)printf("%lld ",ad[i]);
	return 0;
}
2020/11/26 16:36
加载中...