样例全过,0pt,下载的数据全部读入之后还能读,求调读入部分/kk
全部代码:
#include <bits/stdc++.h>
using namespace std;
const int Maxn=5000001,mod=998244353;
inline long long read()
{
long long x=0;
char c=getchar();
for(; c<'0' || c>'9'; c=getchar());
for(; (c<='9') && (c>='0'); c=getchar())
x=(x<<3)+(x<<1)+c-'0';
return x;
}
struct fluas
{
long long lei,c,k,p,mul,sum;
} han[Maxn];
struct popw
{
long long next,v;
} e[Maxn];
long long head[Maxn],cnt,ind[Maxn];
void addedge(int u,int v)
{
cnt++;
e[cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
ind[v]++;
}
long long n,m,ccnt,q,a[Maxn],dfn[Maxn],f[Maxn];
void Topo()
{
queue<int> Q;
for(int i=1; i<=m; i++)
{
if(ind[i]==0)
Q.push(i);
while(!Q.empty())
{
int x=Q.front();
Q.pop();
dfn[++ccnt]=x;
for(int i=head[x]; i; i=e[i].next)
{
ind[e[i].v]--;
if(!ind[e[i].v])
Q.push(e[i].v);
}
}
}
}
void getmul()
{
for(int i=m; i; i--)
{
int x=dfn[i];
for(int j=head[x]; j; j=e[j].next)
{
han[x].mul=(han[x].mul*han[e[j].v].mul)%mod;
}
}
}
void getsum()
{
for(int i=1; i<=m; i++)
{
int x=dfn[i];
long long now=1;
for(int j=head[x]; j; j=e[j].next)
{
han[e[j].v].sum=(han[e[j].v].sum+han[x].sum*now)%mod;
now*=han[e[j].v].mul;
}
}
}
int main()
{
scanf("%lld",&n);
for(int i=1; i<=n; i++)
scanf("%lld",&a[i]);
scanf("%lld",&m);
for(int i=1; i<=m; i++)
{
scanf("%lld",&han[i].lei);
if(han[i].lei==1)
{
scanf("%lld",&han[i].p),scanf("%lld",&han[i].k);
han[i].mul=1;
}
else if(han[i].lei==2)
{
scanf("%lld",&han[i].mul);
}
else
{
han[i].mul=1;
scanf("%lld",&han[i].c);
for(int j=1,x; j<=han[i].c; j++)
{
scanf("%d",&x);
addedge(i,x);
}
}
}
Topo();
getmul();
scanf("%lld",&q);
long long now=1;
for(int i=1; i<=q; i++)
scanf("%lld",&f[i]);
for(int i=q; i; i--)
{
int x=f[i];
han[x].sum=(han[x].sum+now)%mod;
now*=han[x].mul;
}
getsum();
for(int i=1; i<=n; i++)
a[i]*=now%mod;
for(int i=1; i<=m; i++)
{
if(han[i].lei==1)
{
a[han[i].p]=(a[han[i].p]+han[i].sum*han[i].k);
}
}
for(int i=1; i<=n; i++)
cout<<a[i]<<' ';
return 0;
}
部分代码:
inline long long read()
{
long long x=0;
char c=getchar();
for(; c<'0' || c>'9'; c=getchar());
for(; (c<='9') && (c>='0'); c=getchar())
x=(x<<3)+(x<<1)+c-'0';
return x;
}
scanf("%lld",&n);
for(int i=1; i<=n; i++)
scanf("%lld",&a[i]);
scanf("%lld",&m);
for(int i=1; i<=m; i++)
{
scanf("%lld",&han[i].lei);
if(han[i].lei==1)
{
scanf("%lld",&han[i].p),scanf("%lld",&han[i].k);
han[i].mul=1;
}
else if(han[i].lei==2)
{
scanf("%lld",&han[i].mul);
}
else
{
han[i].mul=1;
scanf("%lld",&han[i].c);
for(int j=1,x; j<=han[i].c; j++)
{
scanf("%d",&x);
addedge(i,x);
}
}
}