USACO 2015 December Contest, Platinum Problem Max Flow【树链剖分】
题意比较难理解,就是给你n个点的树,然后给你m个修改操作,每一次修改包括一个点对(x, y),意味着将x到y所有的点权值加一,最后问你整个树上的点权最大是多少。
比较裸的树链剖分了,感谢Haild的讲解。
首先第一遍dfs预处理出size,son(重儿子)。
第二遍dfs重编号。
然后线段树就可以了。
感觉就是把一棵树弄成一条一条的链,新奇的hash方法。
- #include <bits/stdc++.h>
- #define rep(i, a, b) for (int i = a; i <= b; i++)
- #define drep(i, a, b) for (int i = a; i >= b; i--)
- #define REP(i, a, b) for (int i = a; i < b; i++)
- #define pb push_back
- #define mp make_pair
- #define clr(x) memset(x, 0, sizeof(x))
- #define xx first
- #define yy second
- using namespace std;
- typedef long long i64;
- typedef pair<int, int> pii;
- const int inf = ~0U >> ;
- const i64 INF = ~0ULL >> ;
- //*******************************
- template <typename T> void MAX(T &a, T &b) { if (a < b) a = b; }
- template <typename T> void MIN(T &a, T &b) { if (a > b) a = b; }
- const int maxn = ;
- struct Ed {
- int u, v, nx; Ed() {}
- Ed(int _u, int _v, int _nx) :
- u(_u), v(_v), nx(_nx) {}
- } E[maxn << ];
- int G[maxn], edtot;
- void addedge(int u, int v) {
- E[++edtot] = Ed(u, v, G[u]);
- G[u] = edtot;
- E[++edtot] = Ed(v, u, G[v]);
- G[v] = edtot;
- }
- struct Seg_Tree {
- int lazy[maxn << ], Max[maxn << ];
- void Push_down(int o) {
- if (!lazy[o]) return;
- lazy[o << ] += lazy[o], lazy[o << | ] += lazy[o];
- Max[o << ] += lazy[o], Max[o << | ] += lazy[o];
- lazy[o] = ;
- }
- void Push_up(int o) { Max[o] = max(Max[o << ], Max[o << | ]); }
- void update(int o, int l, int r, int ql, int qr, int v) {
- if (ql <= l && r <= qr) {
- lazy[o] += v;
- Max[o] += v;
- return;
- }
- Push_down(o);
- int mid = l + r >> ;
- if (ql <= mid) update(o << , l, mid, ql, qr, v);
- if (qr > mid) update(o << | , mid + , r, ql, qr, v);
- Push_up(o);
- }
- } T;
- int size[maxn], pre[maxn], son[maxn], dep[maxn];
- int dfs_size(int x, int fa) {
- size[x] = ; int haha = -inf; pre[x] = fa; dep[x] = dep[fa] + ;
- for (int i = G[x]; i; i = E[i].nx) if (E[i].v != fa) {
- size[x] += dfs_size(E[i].v, x);
- if (size[E[i].v] > haha) haha = size[E[i].v], son[x] = E[i].v;
- }
- return size[x];
- }
- int ndtot, pos[maxn], top[maxn];
- void repos(int x, int tp) {
- pos[x] = ++ndtot;
- top[x] = tp;
- if (son[x]) repos(son[x], tp);
- for (int i = G[x]; i; i = E[i].nx) if (E[i].v != pre[x] && E[i].v != son[x]) repos(E[i].v, E[i].v);
- }
- int n;
- void update(int x, int y) {
- while (top[x] != top[y]) {
- if (dep[top[x]] < dep[top[y]]) swap(x, y);
- T.update(, , n, pos[top[x]], pos[x], ); x = pre[top[x]];
- }
- T.update(, , n, min(pos[x], pos[y]), max(pos[x], pos[y]), );
- }
- int main() {
- freopen("maxflow.in", "r", stdin);
- freopen("maxflow.out", "w", stdout);
- int m; scanf("%d%d", &n, &m);
- REP(i, , n) {
- int x, y; scanf("%d%d", &x, &y);
- addedge(x, y);
- }
- dfs_size(, );
- repos(, );
- while (m--) {
- int x, y; scanf("%d%d", &x, &y);
- update(x, y);
- }
- printf("%d\n", T.Max[]);
- return ;
- }
USACO 2015 December Contest, Platinum Problem Max Flow【树链剖分】的更多相关文章
- 洛谷P3128 [USACO15DEC]最大流Max Flow [树链剖分]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- USACO 2015 December Contest, Gold Problem 2. Fruit Feast
Problem 2. Fruit Feast 很简单的智商题(因为碰巧脑出来了所以简单一,一 原题: Bessie has broken into Farmer John's house again! ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
- 【NOIP 2015 DAY2 T3】 运输计划 (树链剖分-LCA)
题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...
- BZOJ 4679/Hdu5331 Simple Problem LCT or 树链剖分
4679: Hdu5331 Simple Problem 题意: 考场上,看到这道题就让我想起BZOJ4712洪水.然后思路就被带着飞起了,完全没去考虑一条链的情况,于是GG. 解法:先考虑一条链的做 ...
- [xsy1129] flow [树链剖分和线段树一起优化网络流][我也不知道这是什么鬼标签]
题面 内部OJ 思路 考虑一个决策方案${x}$,$x_i$表示第$i$个点选不选,$f^k_i$表示点$i$的第$k$个父亲 那么可以得到总花费的表达式$ans=\sum V_i x_i - \su ...
- FZU Problem 2082 过路费 树链剖分
Problem 2082 过路费 Problem Description 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每条路的过路费经常会更新, ...
- (中等) HDU 5293 Tree chain problem,树链剖分+树形DP。
Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are ...
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
随机推荐
- m,mm,mmm的用法
通过查看android源码目录下的build/envsetup.sh文件,可知: - m: Makes from the top of the tree. - mm: Build ...
- 转:全面剖析C#正则表达式
到目前为止,许多的编程语言和工具都包含对正则表达式的支持,当然.NET也不例外,.NET基础类库中包含有一个名称空间和一系列可以充分发挥规则表达式威力的类. 正则表达式的知识可能是不少 ...
- HTML元素分类:块级元素 内联元素和内联块状元素
在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 1,块状元素 常用的块状元素有: <div>.<p>.<h1 ...
- Windows API 之 InternetOpen、InternetOpenUrl、InternetReadFile
InternetOpen: Initializes an application's use of the WinINet functions. HINTERNET InternetOpen( _In ...
- ORACLE中CHAR、VARCHAR、NVARCHAR
1. char 固定长度,最长n个字符. 2. varchar 最大长度为n的可变字符串. (n为某一整数,不同数据库,最大长度n不同) char和varchar区别: ...
- cordova插件开发-1
这是初级编,实现了js调用Android代码 首先需要编写java代码: public class AppUpdate extends CordovaPlugin { @Override public ...
- linux logrotate配置
对于Linux 的系统安全来说,日志文件是极其重要的工具.系统管理员可以使用logrotate 程序用来管理系统中的最新的事件,对于Linux 的系统安全来说,日志文件是极其重要的工具.系统管理员可以 ...
- 5V与3.3V器件电平转换
源:5V与3.3V器件电平转换 当你使用3.3V的单片机的时候,电平转换就在所难免了,经常会遇到3.3转5V或者5V转3.3V的情况,这里介绍一个简单的电路,他可以实现两个电平的相互转换(注意是相互哦 ...
- ERROR CL .exe……错误
这个错误遇见了两次,一次是在装VC时,解决办法见 这个 还有一次是VS2012时,遇见了: error MSB6006: “CL.exe”已退出,代码为 -1073741515. 解决办法:Add t ...
- php查找文件内容
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><?ph ...