• 洛谷P3128 [USACO15DEC]Max Flow P 题解 树上差分(点差分)


    题目链接:https://www.luogu.com.cn/problem/P3128

    题目大意:

    给定一个包含 \(n\) 个节点的树,以及 \(k\) 次操作。每次操作你需要将一条路径上的点权均加 \(1\)。求 \(k\) 次操作之后的最大点权。

    解题思路:

    树上差分(点差分)。对于一条路径的两个端点 \(u\)\(v\),设 \(p\) 是它们的LCA,设 \(p'\)\(p\) 的父节点(若 \(p\) 为根节点则 \(p' = p\))。

    开差分数组 \(d\),则 \(d[u]\)\(d[v]\) 依次加 \(1\)\(d[p]\)\(d[p']\) 依次减 \(1\)

    最后对这棵树进行差分(dfs遍历一遍即可)。

    示例程序:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 500050;
    int n, m, pa[maxn][21], dep[maxn];
    vector<int> g[maxn];
    int d[maxn], ans;
    void dfs(int u, int p) {
        dep[u] = dep[p] + 1;
        pa[u][0] = p;
        for (int i = 1; (1<<i) <= dep[u]; i ++)
            pa[u][i] = pa[ pa[u][i-1] ][i-1];
        for (auto v : g[u])
            if (v != p)
                dfs(v, u);
    }
    int lca(int x, int y) {
        if (dep[x] < dep[y]) swap(x, y);
        for (int i = 20; i >= 0; i --) {
            if (dep[ pa[x][i] ] >= dep[y]) x = pa[x][i];
            if (x == y) return x;
        }
        for (int i = 20; i >= 0; i --) {
            if (pa[x][i] != pa[y][i]) {
                x = pa[x][i];
                y = pa[y][i];
            }
        }
        return pa[x][0];
    }
    void dfs2(int u, int p) {
        for (auto v : g[u])
            if (v != p)
               dfs2(v, u), d[u] += d[v];
    }
    int main() {
        ios::sync_with_stdio(0);
        cin >> n >> m;
        for (int i = 1; i < n; i ++) {
            int u, v;
            cin >> u >> v;
            g[u].push_back(v);
            g[v].push_back(u);
        }
        dfs(1, 0);
        while (m --) {
            int u, v, p;
            cin >> u >> v;
            p = lca(u, v);
            d[u] ++;
            d[v] ++;
            d[p] --;
            d[pa[p][0]] --;
        }
        dfs2(1, 0);
        for (int i = 1; i <= n; i ++)
            ans = max(ans, d[i]);
        cout << ans << endl;
        return 0;
    }
    
  • 相关阅读:
    学习WindowsPhone 2013/12/22
    spring-aop学习
    easymock+junit+spring学习·
    javaWeb实现文件上传与下载 (转)
    Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能
    jsp自定义标签
    listener监听器
    移植一个项目到本地的问题
    struts1拦截器
    eclipse开发 javafx(转)
  • 原文地址:https://www.cnblogs.com/quanjun/p/15704620.html
Copyright © 2020-2023  润新知