30pts球调

P7077 [CSP-S2020] 函数调用

zhang_fengrui @ 2024-03-30 17:47:25

#include <cstdio>
#include <queue>
#define int long long
#define mod 998244353
using namespace std;
int n,m;
int a[100005];
struct Edge{
    int next;
    int to;
}es[1000005],es1[1000005];
int head[100005],cnt;
int head1[100005],cnt1;
int in[100005];
int in1[100005],in2[100005];
int cs[100005];
void add(int u,int v){
    es[cnt].next=head[u];
    es[cnt].to=v;
    in[v]++;
    head[u]=cnt;
    cnt++;
}
void add1(int u,int v){
    es1[cnt1].next=head1[u];
    es1[cnt1].to=v;
    in2[v]++;
    head1[u]=cnt1;
    cnt1++;
}
int hmul[100005];
pair<int,int> hplu[100005];
int mul[100005];
void tuopu1(){
    queue<int> q;
    for(int i=1;i<=m+1;i++){
        in1[i]=in[i];
        if(in1[i]==0){
            q.push(i);
        }
    }
    while(!q.empty()){
        int u=q.front();
        q.pop();
        mul[u]*=hmul[u];
        mul[u]%=mod;
        //printf("u:%d mul[u]:%d\n",u,mul[u]);
        for(int i=head[u];i;i=es[i].next){
            int v=es[i].to;
            mul[v]*=mul[u];
            mul[v]%=mod;
            in1[v]--;
            if(in1[v]==0){
                q.push(v);
            }
        }
    }
}
void tuopu2(){
    queue<int> q;
    for(int i=1;i<=m+1;i++){
        in1[i]=in2[i];
        if(in1[i]==0){
            cs[i]++;
            q.push(i);
        }
    }
    while(!q.empty()){
        int u=q.front();
        //printf("u:%d cs[u]:%d\n",u,cs[u]);
        q.pop();
        int now_mul=1;
        for(int i=head1[u];i;i=es1[i].next){
            int v=es1[i].to;
            in1[v]--;
            cs[v]= (cs[v]+cs[u]*now_mul)%mod;
            cs[v]%=mod;
            now_mul*=mul[v];
            now_mul%=mod;
            //printf("v:%d in1[v]:%d\n",v,in1[v]);
            if(in1[v]==0){
                q.push(v);
            }
        }
    }
}
signed main(){
    mul[0] = 1;
    cnt=1;
    cnt1=1;
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    scanf("%lld",&m);
    for(int i=1;i<=m;i++){
        hmul[i]=1;
        mul[i]=1;
        int t;
        scanf("%lld",&t);
        if(t==1){
            int p,v;
            scanf("%lld%lld",&p,&v);
            hplu[i].first=p;
            hplu[i].second=v;
        }
        else if(t==2){
            int v;
            scanf("%lld",&v);
            hmul[i]=v;
        }
        else{
            int c;
            scanf("%lld",&c);
            for(int j=1;j<=c;j++){
                int u;
                scanf("%lld",&u);
                add(u,i);
                add1(i,u);
            }
        }
    }
    hmul[m+1]=1;
    mul[m+1]=1;
    int Q;
    scanf("%lld",&Q);
    for(int j=1;j<=Q;j++){
        int u;
        scanf("%lld",&u);
        add(u,m+1);
        add1(m+1,u);
    }
    tuopu1();
    tuopu2();
    //printf("mul[m+1]:%d\n",mul[m+1]);
    for(int i=1;i<=n;i++){
        a[i]*=mul[m+1];
        a[i]%=mod;
    }
    for(int i=1;i<=m;i++){
        //printf("i:%d cs[i]:%d\n",i,cs[i]);
        a[hplu[i].first]= (a[hplu[i].first]+cs[i]*hplu[i].second)%mod;
        a[hplu[i].first]%=mod;
    }
    for(int i=1;i<=n;i++){
        printf("%lld ",a[i]);
    }
    return 0;
}

|