家人们 确实有一点复杂
2024-07-11 16:32:49
发布于:上海
2阅读
0回复
0点赞
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e5+9,mod=998244353;
vector<int> G[N],g[N];
int n,m,q,mul[N],op[N],add[N],f[N];
int Q[N],hh,tt,a[N],pos[N],in[N];
int Add[N],Mul[N];
inline int read()
{
int res=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
res=(res<<3)+(res<<1)+ch-'0',ch=getchar();
return res*f;
}
inline void rev_toposort()
{
hh=0,tt=-1;
for(int i=1;i<=m;i++) if(!in[i]) Q[++tt]=i;
while(hh<=tt)
{
int u=Q[hh++];
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
mul[v]=1ll*mul[u]*mul[v]%mod;
if(--in[v]==0) Q[++tt]=v;
}
}
}
inline void toposort()
{
memset(in,0,sizeof in);
for(int i=1;i<=m;i++)
for(int j=0;j<G[i].size();j++)
in[G[i][j]]++;
hh=0,tt=-1;
for(int i=1;i<=m;i++) if(!in[i]) Q[++tt]=i;
while(hh<=tt)
{
int u=Q[hh++];
for(int i=G[u].size()-1;i>=0;i--)
{
int v=G[u][i];
Add[v]=(Add[v]+Add[u])%mod;
Add[u]=1ll*Add[u]*mul[v]%mod;
if(--in[v]==0) Q[++tt]=v;
}
}
}
int main()
{
// freopen("call.in","r",stdin);
// freopen("call.out","w",stdout);
n=read();
for(int i=1;i<=n;i++) a[i]=read();
m=read();
for(int i=1;i<N;i++) mul[i]=1;
for(int i=1;i<=m;i++)
{
op[i]=read();
if(op[i]==1) pos[i]=read(),add[i]=read();
if(op[i]==2) mul[i]=read();
if(op[i]==3)
{
int cnt;cnt=read();
while(cnt--)
{
int x;x=read();
g[x].push_back(i);in[i]++;
G[i].push_back(x);
}
}
}
rev_toposort();
q=read();
for(int i=1;i<=q;i++) f[i]=read();Mul[q+1]=1;
for(int i=q;i>=1;i--)
{
Mul[i]=1ll*Mul[i+1]*mul[f[i]]%mod;
Add[f[i]]=(Add[f[i]]+Mul[i+1])%mod;
}
for(int i=1;i<=n;i++) a[i]=1ll*a[i]*Mul[1]%mod;
toposort();
for(int i=1;i<=m;i++)
if(op[i]==1) a[pos[i]]=(a[pos[i]]+1ll*add[i]*Add[i]%mod)%mod;//printf("%d %d\n",pos[i],Add[i]);
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
这里空空如也
有帮助,赞一个