求助 40(有注释)

P7077 [CSP-S2020] 函数调用

General0826 @ 2024-10-22 19:05:29

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=5e5+5,P=998244353;
struct dian{
    ll num,x,w;
}sxf[N];
ll l,r,m,n,op,x,w;
ll lu[N],a[N],que[N],sum[N],cs[N],yux[N],mt[N],inc[N],inf[N],k,qj; 
vector<ll> c[N],f[N];
ll q_pow(ll a,ll b){ //快速幂 T
    ll num=a,cnt=1,op=b;
    return a;
    while(b){
        if(b&1) cnt=1ll*(cnt*num)%P;
        num=1ll*(num*num)%P;
        b>>=1;
    }
}
void tfort(vector<ll> c[],ll inc[]){  //T
    l=1,r=0;
    for(ll i=1;i<=m;i++){
        sum[i]=sxf[i].num;
        if(inc[i]==0){
            que[++r]=i;
        }
    }
    //将一个函数的基本贡献算上 T

    while(l<=r){
        ll v=que[l];
        for(auto i:c[v]){
            if(inc[i]!=0){
                --inc[i];
                sum[i]=(sum[v]*sum[i])%P;
                //转移 
                if(inc[i]==0){
                    que[++r]=i;
                }   
            }
        }
        l++;
    }
} 
void topsort(ll inc[]){

    memset(cs,0,sizeof(cs));
    l=1,r=1;
    que[1]=m+1; 
    cs[m+1]=sum[m+1]=1; // 将m+1加入 

    while(l<=r){
        ll v=que[l],mk=cs[v];

        lu[sxf[v].x]=(lu[sxf[v].x]+(sxf[v].w*cs[v])%P)%P;
        //将对单点的贡献算上 

        for(ll i=(ll)(c[v].size())-1;i>=0;i--){
            ll nxt=c[v][i];
            if(inc[nxt]!=0){
//          
                inc[nxt]--;
                if(inc[nxt]==0){
                    que[++r]=nxt;
                }  //top部分 

    //              yux[nxt]+=yux[v]; //将使用次数加上 

                cs[nxt]=(cs[nxt]+mk)%P;//将后缀乘加上 

                mk=(mk*sum[nxt])%P; 
                //算出 他对后缀乘的贡献 

            }
            }

        if(l==1) //全局贡献 
            qj=mk;
        l++;

    }
}
int main(){

    cin>>n;
    for(ll i=1;i<=n;i++)
        cin>>a[i];
    cin>>m;
    for(ll i=1;i<=m;i++){
        cin>>op;
        if(op==1){
            cin>>x>>w;
            sxf[i]=(dian){1,x,w};
        }
        else if(op==2){
            cin>>w;
            sxf[i]=(dian){w,0,0};
        } 
        else{
            cin>>x;
            sxf[i]=(dian){1,0,0};
            for(ll j=1;j<=x;j++){
                cin>>w;
                c[i].emplace_back(w); //正边
                inc[w]++;
                f[w].emplace_back(i); //反边 
                inf[i]++;   
            }
        }
    }
    // 输入 

    tfort(f,inf);

    //反向top,算出每个函数对积的贡献 

    cin>>k;
    for(ll i=1;i<=k;i++){
        cin>>x;
        c[m+1].emplace_back(x);
        inc[x]++;
    }
    //输入,并建边将m+1(main)当做一个函数处理 

//  for(lli=0;i<=m;i++){
//      cout<<'^'<<i<<' '<<sum[i]<<'\n';
//      for(llj=0   ;j<c[i].size();j++){
//          cout<<c[i][j]<<' ';
//      }cout<<'\n';
//  }

    topsort(inc);

    //处理 

    for(ll i=1;i<=n;i++){
        cout<<(a[i]*qj%P+lu[i])%P<<' ';
    } 
    //输出 
    return 0;    
}   

//      cout<<v<<' '<<sum[v]<<'\n';
//      cout<<v<<' '<<yux[v]<<' '<<cs[v]<<'\n'; 
//              if(sxf[v].w *cs[v]*yux[v]!=0){
//                  cout<<sxf[v].w *cs[v]*yux[v]<<" "<<sxf[v].x<<'\n';
//              }  
/*

*/

by wangxiaoyi1118 @ 2024-10-22 19:05:52

qp


by lihongqian__int128 @ 2024-10-22 19:06:16

@General0826 哇,是 Gengen!

虽然我不会,只有 10pts


by wangxiaoyi1118 @ 2024-10-22 19:06:41

莱德不会又要自救吧


by Jerrycyx @ 2024-10-22 19:09:07

莱德,需要我们


by yangyafan @ 2024-10-22 19:10:07

莱德,需要我们


by Ace_FutureDream @ 2024-10-22 19:10:54

@General826

@General00826

@General000826

@General0000826

@General00000826

@General000000826

莱德,需要你们


by z_z_b_ @ 2024-10-22 19:11:19

莱德,需要我们


by jrzhr @ 2024-10-22 19:11:46

莱德,需要我们


by Fish_ht @ 2024-10-22 19:13:39

@General0826

@General00826

@General000826

@General0000826

@General00000826

@General000000826

莱德,需要你们。


by ycyxh1 @ 2024-10-22 19:21:43

呼叫Gengen队

@General0826

@General00826

@General000826

@General0000826

@General00000826

@General000000826

莱德,需要你们。


| 下一页