1 solutions

  • 0
    @ 2026-8-24 22:28:34

    10pts

    #include <bits/stdc++.h>
    using namespace std;
    const long long MOD = 998244353;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        
        int n;
        cin >> n;
        vector<long long> a(n + 1);
        for (int i = 1; i <= n; i++) cin >> a[i];
        
        int m;
        cin >> m;
        
        vector<int> type(m + 1), p(m + 1);
        vector<long long> v(m + 1);
        
        for (int i = 1; i <= m; i++) {
            cin >> type[i];
            if (type[i] == 1) {
                cin >> p[i] >> v[i];
            } else if (type[i] == 2) {
                cin >> v[i];
            } else {
                // 类型3不会出现,但为了读入格式,需要读c
                int c;
                cin >> c;
                // 没有子函数,直接跳过
            }
        }
        
        int Q;
        cin >> Q;
        vector<int> seq(Q);
        for (int i = 0; i < Q; i++) cin >> seq[i];
        
        // 因为是树,∑C_j = 0,没有函数调用
        // 直接从后往前处理执行序列
        vector<long long> add(n + 1, 0);
        long long mul = 1;
        
        for (int i = Q - 1; i >= 0; i--) {
            int f = seq[i];
            if (type[f] == 1) {
                // 单点加,乘上当前的乘法因子
                add[p[f]] = (add[p[f]] + v[f] % MOD * mul) % MOD;
            } else if (type[f] == 2) {
                // 全局乘,更新乘法因子
                mul = mul * (v[f] % MOD) % MOD;
            }
            // type 3不会出现
        }
        
        // 输出结果
        for (int i = 1; i <= n; i++) {
            cout << (a[i] * mul + add[i]) % MOD << (i == n ? '\n' : ' ');
        }
        
        return 0;
    }
    

    70pts

    #include <bits/stdc++.h>
    using namespace std;
    const long long MOD = 998244353;
    
    struct Func {
        int type, p;
        long long v;
        vector<int> child;
    };
    
    int n, m, Q;
    long long a[1000005], add[1000005], mul[1000005];
    Func f[1000005];
    
    // 计算乘法贡献
    void dfs1(int u) {
        if (f[u].type == 1) mul[u] = 1;
        else if (f[u].type == 2) mul[u] = f[u].v % MOD;
        else {
            mul[u] = 1;
            for (int c : f[u].child) {
                dfs1(c);
                mul[u] = mul[u] * mul[c] % MOD;
            }
        }
    }
    
    // 处理加法
    void dfs2(int u, long long now) {
        if (f[u].type == 1) {
            add[f[u].p] = (add[f[u].p] + f[u].v % MOD * now) % MOD;
        }
        else if (f[u].type == 3) {
            for (int i = f[u].child.size() - 1; i >= 0; i--) {
                int c = f[u].child[i];
                dfs2(c, now);
                now = now * mul[c] % MOD;
            }
        }
    }
    
    int main() {
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i];
        
        cin >> m;
        for (int i = 1; i <= m; i++) {
            cin >> f[i].type;
            if (f[i].type == 1) cin >> f[i].p >> f[i].v;
            else if (f[i].type == 2) cin >> f[i].v;
            else {
                int c; cin >> c;
                f[i].child.resize(c);
                for (int j = 0; j < c; j++) cin >> f[i].child[j];
            }
        }
        
        cin >> Q;
        vector<int> seq(Q);
        for (int i = 0; i < Q; i++) cin >> seq[i];
        
        // 算所有函数的乘法
        for (int i = 1; i <= m; i++) dfs1(i);
        
        // 从后往前执行
        long long now = 1;
        for (int i = Q - 1; i >= 0; i--) {
            dfs2(seq[i], now);
            now = now * mul[seq[i]] % MOD;
        }
        
        for (int i = 1; i <= n; i++) {
            cout << (a[i] * now + add[i]) % MOD << (i == n ? '\n' : ' ');
        }
    }
    
    • 1

    Information

    ID
    1144
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    10
    Accepted
    1
    Uploaded By