30 pts 求 hack

P7077 [CSP-S2020] 函数调用

sbno333 @ 2024-10-24 22:22:11

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353ll
#define pii pair<int,int>
int a[1000009];
struct st{
    int v,ne;
    int w;
}sd[2000009];
vector<int> z[100009];
int nn[100009];
int inn;
int h[100009];
void add(int u,int v){
    sd[++inn].v=v;
    sd[inn].ne=h[u];
    h[u]=inn;
}
int cd[100009];
int lx[100009];
int xl[100009];
bool vis[100009]; 
priority_queue<pii,vector<pii>,greater<pii> > q; 
int mj[100009];
int ii;
int dp[100009];
int rd[100009];
void dfs(int t){
    if(lx[t]){
        if(xl[t]){
            a[xl[t]]+=lx[t]*dp[t];
            a[xl[t]]%=mod;
        }
        return;
    }
    for(int i=h[t];i;i=sd[i].ne){
        dp[sd[i].v]+=dp[t]*sd[i].w;
        dp[sd[i].v]%=mod;
        rd[sd[i].v]--;
        if(!rd[sd[i].v]){
            dfs(sd[i].v);
        }
    }
}
signed main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int m;
    cin>>m;
    for(int i=1;i<=m;i++){
        z[i].push_back(0);
    }
    for(int i=1;i<=m;i++){
        int t;
        cin>>t;
        if(t==1){
            int p,c;
            cin>>p>>c;
            xl[i]=p;
            lx[i]=c;
        }else if(t==2){
            int c;
            cin>>c;
            lx[i]=c;
        }else{
            int c;
            cin>>c;
            for(int j=1;j<=c;j++){
                int g;
                cin>>g;
                add(i,g);
                z[g].push_back(0);
                z[g][++nn[g]]=i;
            }
            cd[i]=c;
        }
    }
    for(int i=1;i<=m;i++){
        q.push({cd[i],i});
    }
    while(q.size()){
        int g;
        g=q.top().second;
        q.pop();
        if(vis[g]){
            continue;
        }
        vis[g]=1;
        mj[++ii]=g;
        for(int i=1;i<=nn[g];i++){
            cd[z[g][i]]--;
            q.push({cd[z[g][i]],z[g][i]});
        }
    }
    for(int i=1;i<=ii;i++){
        int t;
        t=1;
        for(int j=h[mj[i]];j;j=sd[j].ne){
            sd[j].w=t;
            if(!xl[sd[j].v])
                t*=dp[sd[j].v];
            t%=mod;
        }
        dp[mj[i]]=t;
        if(lx[mj[i]]&&!xl[mj[i]]){
            dp[mj[i]]=lx[mj[i]];
        }
    }
    int q;
    cin>>q;
    for(int i=1;i<=q;i++){
        int x;
        cin>>x;
        add(m+1,x);
    }
    int t;
    t=1;
    for(int j=h[m+1];j;j=sd[j].ne){
        sd[j].w=t;
        if(!xl[sd[j].v])
            t*=dp[sd[j].v];
        t%=mod;
    }
    dp[m+1]=t;
    if(lx[m+1]&&!xl[m+1]){
        dp[m+1]=lx[m+1];
    }
    for(int i=1;i<=n;i++){
        a[i]*=dp[m+1];
        a[i]%=mod;
    }
    for(int i=1;i<=m+1;i++){
        dp[i]=0;
        for(int j=h[i];j;j=sd[j].ne){
            rd[sd[j].v]++;
        }
    }
    dp[m+1]=1;
    dfs(m+1);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    return 0;
} 

|