明明明明子丶 @ 2020-11-23 00:18:58
"不妨将题目看成:将所有数乘上 mul,再给某些数加上 add_i,其中 mul 是所有被调用的 type II 函数给所有数乘的 V_j之积。" ----第一篇题解
主要部分
for(int i=k;i>=1;i--){
int kk=ls[i];
if(f[kk].t==2){
mul=mul*f[kk].v%mod;
}
if(f[kk].t==1){
int p=f[kk].p,v=f[kk].v;
add[p]=(add[p]+v*mul%mod)%mod;
}
}
源代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100005;
const ll mod=998244353;
ll a[N];
struct Fun{
int t;
int p,v,n;
vector<int> s;
}f[N];
ll mul;
ll add[N];
int ls[N],k;
void f3(int x){
for(int j=0;j<f[x].n;j++){
int tt=f[x].s[j];
if(f[tt].t==3)f3(tt);
else ls[++k]=tt;
}
}
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%lld",a+i);
int m;
cin>>m;
// cout<<m;
for(int i=1;i<=m;i++){
int t;
scanf("%d",&t);
f[i].t=t;
if(t==1)
scanf("%d%d",&f[i].p,&f[i].v);
if(t==2)
scanf("%d",&f[i].v);
if(t==3){
scanf("%d",&f[i].n);
for(int j=1;j<=f[i].n;j++){
int p;
scanf("%d",&p);
f[i].s.push_back(p);
}
}
}
int q;
cin>>q;
for(int i=1;i<=q;i++){
int x;
scanf("%d",&x);
if(f[x].t==3)f3(x);
else ls[++k]=x;
}
mul=1;
for(int i=k;i>=1;i--){
int kk=ls[i];
if(f[kk].t==2){
mul=mul*f[kk].v%mod;
}
if(f[kk].t==1){
int p=f[kk].p,v=f[kk].v;
add[p]=(add[p]+v*mul%mod)%mod;
}
}
for(int i=1;i<=n;i++){
cout<<(a[i]*mul%mod+add[i])%mod<<' ';
}
cout<<endl;
}
by Binah @ 2020-11-23 08:01:04
我也差不多,wa75