50分求助
查看原帖
50分求助
330759
囧仙楼主2020/11/11 11:31
  • RT\frak{RT} ,只过了没有操作三的点和保证是树的点。不保证事树的点全 WA\text{WA} /fad
#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
const int MOD =998244353;
const int MAXN=1e5+3,MAXM=2e6+1e5+3;
int H[MAXM],R[MAXM],N[MAXM],O[MAXM],tot;
int qread(){
    int w=1,c,ret;
    while((c=getchar())> '9'||c< '0') w=(c=='-'?-1:1); ret=c-'0';
    while((c=getchar())>='0'&&c<='9') ret=ret*10+c-'0';
    return ret*w;
}
void add(int u,int v){
    R[++tot]=v,N[tot]=H[u],H[u]=tot,++O[v];
}
int I[MAXM],P[MAXM],V[MAXM],T[MAXM],F[MAXM];
int clc(int u){
    if(T[u]!=-1) return T[u]; T[u]=1;
    for(int i=H[u];i;i=N[i]) T[u]=1ll*T[u]*clc(R[i])%MOD;
    return T[u];
}
int A[MAXM],Q[MAXM],C[MAXM],n,m,q,r;
int main(){
    n=qread(); up(1,n,i) add(0,i),P[i]=i,V[i]=qread(),T[i]=1,I[i]=1;
    m=qread(); up(n+1,n+m,i) switch(I[i]=qread()){
        case 1: P[i]=qread(),V[i]=qread(),T[i]=1; break;
        case 2: V[i]=qread(),T[i]=V[i];           break;
        case 3: up(1,qread(),j) add(i,qread()+n); T[i]=-1;
    }
    up(1,n+m,i) clc(i); q=qread(); up(1,q,i) add(0,n+qread());
    Q[++r]=0,I[0]=3,C[0]=1; while(r>0){
        int u=Q[r],x=C[u]; --r; printf("u=%d\n",u);
        if(I[u]==3) for(int i=H[u];i;i=N[i]){
            C[R[i]]=(x+C[R[i]])%MOD,--O[R[i]];
            if(O[R[i]]==0) Q[++r]=R[i]; x=1ll*x*T[R[i]]%MOD;
        } else if(I[u]==1) A[P[u]]=(1ll*V[u]*x+A[P[u]])%MOD;
    }
    up(1,n,i) printf("%d ",A[i]);
    return 0;
}
2020/11/11 11:31
加载中...