洛谷-P3919-可持久化数组

题目传送门

sol:在洛谷上看到一种dfs + 离线的方法,可以解决大部分可持久化问题。把依赖关系看成边,然后建树。这样本来要解决的多个版本只要在一个版本上进行修改就好了。

  • 离线 + dfs
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef pair<int, int> PII;
    const int MAXN = 1e6 + 10;
    vector<int> edge[MAXN];
    int a[MAXN], b[MAXN], c[MAXN], d[MAXN];
    int ans[MAXN];
    void dfs(int u) {
        int tmp = a[c[u]];
        if (b[u] == 1) a[c[u]] = d[u];
        else ans[u] = tmp;
        for (auto v : edge[u]) dfs(v);
        a[c[u]] = tmp;
    }
    int main() {
        int n, m;
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        for (int i = 1; i <= m; i++) {
            int fa; scanf("%d", &fa);
            edge[fa].push_back(i);
            scanf("%d%d", &b[i], &c[i]);
            if (b[i] == 1) scanf("%d", &d[i]);
        }
        dfs(0);
        for (int i = 1; i <= m; i++) {
            if (b[i] == 2)
                printf("%d\n", ans[i]);
        }
        return 0;
    }

     

posted @ 2019-12-17 09:23  Jathon-cnblogs  阅读(141)  评论(0编辑  收藏  举报