50pts求助

P7077 [CSP-S2020] 函数调用

KR_01 @ 2021-07-15 08:21:16

#include<bits/stdc++.h>
using namespace std;
const int mo=998244353;
#define int long long
int n,m,a[100100];
struct hs1{
    int p;
    int v;
}h1[100100];
int h2[100100];
struct hs3{
    int sum;
    vector<int>q;
}h3[100100];
int dy[100100],q[100100];
int cj[100100],sum[100100],deep[100100];
vector<int>ma[100100];
int dfs(int pl){
    if(cj[pl]!=-1){
    //  if(cj[pl]==0)cout<<pl<<" "<<cj[pl]<<endl;
        return cj[pl];
    }
    int re=1;
    for(int i=0;i<ma[pl].size();i++){
        (re*=dfs(ma[pl][i]))%=mo;
    //  if(pl==0)cout<<ma[pl][i]<<" "<<dfs(ma[pl][i])<<endl;
    }
    return cj[pl]=re;
}
signed main(){
//  freopen("P7077_1.in","r",stdin);
    memset(cj,-1,sizeof cj);
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);

    scanf("%lld",&m);
    for(int i=1;i<=m;i++){
        int op,xx,yy;
        scanf("%lld",&op);
        dy[i]=op;
        if(op==1){
            scanf("%lld%lld",&xx,&yy);
            h1[i].p=xx;
            h1[i].v=yy;
        }
        if(op==2){
            scanf("%lld",&xx);
            h2[i]=xx;
        }
        if(op==3){
            scanf("%lld",&xx);
            h3[i].sum=xx;
            for(int j=1;j<=xx;j++)
                scanf("%lld",&yy),
                h3[i].q.push_back(yy),
                ma[i].push_back(yy),
                deep[yy]++;
        }
    }
    for(int i=1;i<=m;i++){
        if(dy[i]==1)cj[i]=1;
        if(dy[i]==2)cj[i]=h2[i];
    //  if(cj[i]==0)cout<<i<<"*"<<endl;
    }
    dy[0]=3;
    int Q;
    scanf("%lld",&Q);
    for(int i=1;i<=Q;i++){
        int xx;
        scanf("%lld",&xx);
        q[i]=xx;
        ma[0].push_back(xx);
        deep[xx]++;
    }
    for(int i=0;i<=m;i++)
        if(dy[i]==3)dfs(i);//,cout<<cj[i]<<"("<<endl
//  cout<<cj[0]<<"*"<<endl;
    sum[0]=1;
    int now=1;
    queue<int>q;
    q.push(0);
    while(q.size()){
        int x=q.front();
    //  cout<<q.size()<<":";
        q.pop();
        now=1;
        //cout<<x<<"*"<<endl;
        for(int i=ma[x].size();i>=1;i--){
            int to=ma[x][i-1];
            deep[to]--;
            if(deep[to]==0)q.push(to);
            (sum[to]+=sum[x]*now%mo)%=mo;
            (now*=cj[to])%=mo;
        //  cout<<now<<" "<<cj[to]<<endl;
        }
    //  
    }
//  cout<<sum[6]<<endl;
//  cout<<now<<endl;
//  for(int i=1;i<=m;i++)
//      cout<<cj[i]<<" ";,cout<<cj[0]<<endl;

    for(int i=1;i<=n;i++)
        (a[i]*=cj[0])%=mo;
    for(int i=1;i<=m;i++)
        if(dy[i]==1){
            (a[h1[i].p]+=sum[i]*h1[i].v%mo)%=mo;
        }
    for(int i=1;i<=n;i++)
        cout<<a[i]<<" ";
    puts("");
}

wa的蛮离谱的

测评这里 大佬救命


by KR_01 @ 2021-08-07 19:12:08

好了

我脑子抽了

拓扑入队没有循环

此贴完结


by Coros_Trusds @ 2021-08-08 14:49:10

\boldsymbol{\color{red}O\color{balck}rz~dalao}

by luyanting @ 2022-02-18 23:39:06

dalao我和你错的点一样想问问是哪里有问题@KR_01


|