WOJ The Highest Peak(离线LCA+端点打tag)
来源:互联网 发布:杭州男装批发市场知乎 编辑:程序博客网 时间:2024/06/06 04:16
题目分析
一眼望去赤裸裸的树链剖分,然而老年人早已经忘了树链剖分如何写了,然后这道题比赛的时候树链剖分会超时,还可能有爆栈。好吧,不纠结这么多了,看一下官方做法吧。这道题因为是一直插入最后求最高点就可以了。我们想一想对于线性序列来说如何要让某个区间增加一个数或者减少一个数我们怎么做。我们可以在区间头增加一个数,在区间尾减少一个数,然后把所有的插入处理完之后直接跑前缀和即可得出结果。这道题同样也是这样。我们利用离线LCA处理出公共祖先结点,然后我们就在2个叶子结点和公共祖先结点做相关操作。然后把所有的操作处理完,然后dfs一遍树即可。不懂的可以看代码。
#include <bits/stdc++.h>using namespace std;const int maxn = 5e5+100;struct Edge{ int to, next;}e[maxn<<1];int father[maxn][21], dep[maxn], head[maxn], tot;long long sum[maxn];void addedge(int from, int to){ e[tot].to = to; e[tot].next = head[from]; head[from] = tot++;}void dfs(int u, int fa){ dep[u] = dep[fa] + 1; father[u][0] = fa; for(int i = 1; i <= 20; i++) father[u][i] = father[father[u][i-1]][i-1]; for(int i = head[u]; i != -1; i = e[i].next){ int v = e[i].to; if(v == fa) continue; dfs(v, u); }}int get_lca(int x, int y){ if(dep[x] < dep[y]) swap(x, y); int temp = dep[x] - dep[y]; for(int i = 20; i >= 0; i--) if((temp>>i)&1) x = father[x][i]; if(x == y) return x; for(int i = 20; i >= 0; i--){ if(father[x][i] != father[y][i]){ x = father[x][i]; y = father[y][i]; } } return father[x][0];}void solve(int u, int fa){ for(int i = head[u]; i != -1; i = e[i].next){ int v = e[i].to; if(v == fa) continue; solve(v, u); sum[u] += sum[v]; }}void init(){ memset(head, -1, sizeof(head)); memset(father, 0, sizeof(father)); memset(sum, 0, sizeof(sum)); tot = 0;}int main(){ int n, m; while(scanf("%d%d", &n, &m) != EOF){ init(); int u, v, val; for(int i = 1; i < n; i++){ scanf("%d%d", &u, &v); addedge(u, v); addedge(v, u); } dfs(1, 0); while(m--){ scanf("%d%d%d", &u, &v, &val); int lca = get_lca(u, v); //找祖先结点 sum[u] += val; sum[v] += val; sum[lca] -= val; sum[father[lca][0]] -= val; //这里把孩子得出的值向祖先递推时因为有2个孩子结点,这样就会多加一次,因此父亲的父亲需要做相关处理 } solve(1, 0); int ans = 1; for(int i = 2; i <= n; i++) if(sum[i] > sum[ans]) ans = i; printf("%d %lld\n", ans, sum[ans]); } return 0;}
0 0
- WOJ The Highest Peak(离线LCA+端点打tag)
- Codeforces 575B Bribe数链剖分+离线+区间端点打标记
- WOJ 651 离线LCA+链上修改+静态查询(树上前缀和?)
- poj 3728 The merchant(离线LCA 的应用,5级)
- ZOJ Problem Set - 3195 Design the city 【Tarjan离线LCA】
- 【HDU】4912 Paths on the tree 离线LCA+贪心
- ZOJ 3195 - Design the city(LCA'离线算法Tarjan)
- hdu5501 The Highest Mark
- The Highest Mark_hdu5501_dp+贪心
- LCA 离线算法 tarjan
- poj1330 LCA离线算法
- HDU2586 离线tarjan LCA
- LCA 离线tarjan算法
- POJ1330(LCA-离线tarjan)
- LCA Tarjan离线算法
- LCA(离线算法)
- LCA离线算法
- LCA离线算法tarjan
- OpenCV Python教程(1、图像的载入、显示和保存)
- 一次SSIS Package的调试经历
- JAVA环境变量配置
- jquery之数组操作
- 软件测试 (一) 软件测试方法大汇总
- WOJ The Highest Peak(离线LCA+端点打tag)
- TSQL HASHBYTES 用法
- CMake快速入门(for windows)
- 使用 Java 8 学习 MongoDB(Part 1)
- binary 和 varbinary 用法全解
- 开发过程中遇到问题解决方法
- Spring MVC错误:Caused by: java.lang.NoClassDefFoundError: org/springframework/dao/DataAccessException
- Execute Sql Task 的Result DataSet如何返回
- 详解ABBYY FineReader 12扫描亮度设置