为什么把函数序列弄出来倒着扫会错

P7077 [CSP-S2020] 函数调用

明明明明子丶 @ 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


|