Codeforces Round #329 (Div. 2) D. Happy Tree Party(LCA+并查集)
题目链接
题意:就是给你一颗这样的树,用一个$y$来除以两点之间每条边的权值,比如$3->7$,问最后的y的是多少,修改操作是把权值变成更小的。
这个$(y<=10^{18})$除的权值如果是$>=2$,那么最多除60几次就变成0了,问题关键是路径上会有好多1存在,这时候我们可以用并查集把他们并到一块,这样就能跳着查了。
具体查法:
从$u$到$LCA(u,v)$,路径上除一遍。
从$v$到$LCA(u,v)$,路径上除一遍。
修改操作如果变成1,就与前面的点合并。
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- using namespace std;
- typedef long long ll;
- const int maxn = 2e5 + ;
- ///加边
- int cnt = , h[maxn];
- struct edge
- {
- int to, pre;
- ll v;
- } e[maxn << ];
- void add(int from, int to, ll v)
- {
- cnt++;
- e[cnt].pre = h[from]; ///5-->3-->1-->0
- e[cnt].to = to;
- e[cnt].v = v;
- h[from] = cnt;
- }
- ///LCA
- int dist[maxn];
- int dep[maxn];
- int anc[maxn][]; ///2分的父亲节点
- ll len[maxn];
- void dfs(int u, int fa)
- {
- for(int i = h[u]; i; i = e[i].pre)
- {
- int v = e[i].to;
- if(v == fa) continue;
- dist[v] = dist[u] + e[i].v;
- dep[v] = dep[u] + ;
- anc[v][] = u;
- len[v] = e[i].v;
- dfs(v, u);
- }
- }
- void LCA_init(int n)
- {
- for(int j = ; ( << j) < n; j++)
- for(int i = ; i <= n; i++) if(anc[i][j-])
- anc[i][j] = anc[anc[i][j-]][j-];
- }
- int LCA(int u, int v)
- {
- int log;
- if(dep[u] < dep[v]) swap(u, v);
- for(log = ; ( << log) < dep[u]; log++);
- for(int i = log; i >= ; i--)
- if(dep[u] - ( << i) >= dep[v]) u = anc[u][i];
- if(u == v) return u;
- for(int i = log; i >= ; i--)
- if(anc[u][i] && anc[u][i] != anc[v][i])
- u = anc[u][i], v = anc[v][i];
- return anc[u][];
- }
- int fa[maxn];
- int Find(int x)
- {
- if(x == fa[x]) return x;
- return fa[x] = Find(fa[x]);
- }
- int main()
- {
- int n, m; scanf("%d %d", &n, &m);
- cnt = ;
- for(int i = ; i <= n; i++) h[i] = ;
- for(int i = ; i <= n - ; i++)
- {
- int u, v;
- ll w; scanf("%d %d %lld", &u, &v, &w);
- add(u, v, w), add(v, u, w);
- }
- ///LCA初始化
- dfs(, );
- LCA_init(n);
- ///并查集初始化
- for(int i = ; i <= n; i++) fa[i] = i;
- while(m--)
- {
- int op, a, b, p;
- ll c, y;
- scanf("%d", &op);
- if(op == )
- {
- scanf("%d %d %lld", &a, &b, &y);
- int fp = LCA(a, b);
- a = Find(a);
- while(dep[a] > dep[fp] && y > 0LL)
- {
- if(len[a] == 1LL)
- {
- fa[a] = anc[a][];
- a = Find(a);
- }
- else
- {
- y /= len[a];
- a = Find(anc[a][]);
- }
- }
- b = Find(b);
- while(dep[b] > dep[fp] && y > 0LL)
- {
- if(len[b] == 1LL)
- {
- fa[b] = anc[b][];
- b = Find(b);
- }
- else
- {
- y /= len[b];
- b = Find(anc[b][]);
- }
- }
- printf("%lld\n", y);
- }
- else
- {
- scanf("%d %lld", &p, &c);
- int u = e[p * ].to, v = e[(p * ) ^ ].to;
- if(u == anc[v][])
- {
- len[v] = c;
- if(c == 1LL)
- {
- fa[v] = u;
- }
- }
- else
- {
- len[u] = c;
- if(c == 1LL)
- {
- fa[u] = v;
- }
- }
- }
- }
- return ;
- }
Codeforces Round #329 (Div. 2) D. Happy Tree Party(LCA+并查集)的更多相关文章
- Codeforces Round #329 (Div. 2) D. Happy Tree Party LCA/树链剖分
D. Happy Tree Party Bogdan has a birthday today and mom gave him a tree consisting of n vertecie ...
- Codeforces Round #396 (Div. 2) D. Mahmoud and a Dictionary 并查集
D. Mahmoud and a Dictionary 题目连接: http://codeforces.com/contest/766/problem/D Description Mahmoud wa ...
- Codeforces Round #250 (Div. 1) B. The Child and Zoo 并查集
B. The Child and Zoo Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/438/ ...
- Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 暴力并查集
D. Dividing Kingdom II 题目连接: http://www.codeforces.com/contest/687/problem/D Description Long time a ...
- Codeforces Round #329 (Div. 2) D. Happy Tree Party 树链剖分
D. Happy Tree Party Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/593/p ...
- Codeforces Round #212 (Div. 2) D. Fools and Foolproof Roads 并查集+优先队列
D. Fools and Foolproof Roads You must have heard all about the Foolland on your Geography lessons. ...
- Codeforces Round #376 (Div. 2) A B C 水 模拟 并查集
A. Night at the Museum time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Codeforces Round #254 (Div. 2) B. DZY Loves Chemistry (并查集)
题目链接 昨天晚上没有做出来,刚看题目的时候还把题意理解错了,当时想着以什么样的顺序倒,想着就饶进去了, 也被题目下面的示例分析给误导了. 题意: 有1-n种化学药剂 总共有m对试剂能反应,按不同的 ...
- Codeforces Round #260 (Div. 1) C. Civilization 树的中心+并查集
题目链接: 题目 C. Civilization time limit per test1 second memory limit per test256 megabytes inputstandar ...
随机推荐
- 如何关闭OSX 10.11 SIP (System Integrity Protection)
http://www.jianshu.com/p/0572336a0771 注意:SIP功能是Apple在OSX上推出的系统完整性保护功能,对于普通MAC用户来说是一项安全保护功能,如果不了解他的作用 ...
- Python基础篇 -- 列表
3.2 列表的增删改查 列表使用 [] 来表示,列表中每个元素与元素之间用逗号隔开 列表也有索引和切片 # 切片切出来的也是列表 lst = ["梅西", "内马 ...
- Spring入门Ioc、DI笔记
Spring是为解决企业应用程序开发复杂性而创建的一个Java开源框架.以下是本人学习过程中总结的一些笔记: 如何学习Spring - 掌握用法 - 深入理解 - 反复总结 - 再次深入理解和实践 s ...
- windows10锁定屏幕聚焦图片导出
打开运行,输入%LocalAppData%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Ass ...
- PAT 乙级 1009
题目 题目地址:PAT 乙级 1009 题解 本题本身属于比较简单的字符串操作题,但是因为对于string的操作和函数不熟悉导致本题做起来很费劲,需要加强对于string类以及相关方法的理解和熟练程度 ...
- 前端 MV*模式
https://github.com/livoras/blog/issues/11 MVC 调用关系如下: Controller(model) ,controller中执行业务逻辑,操作model V ...
- getComputedStyle与currentStyle获取元素当前的css样式
CSS的样式分为三类: 内嵌样式:是写在标签里面的,内嵌样式只对所在的标签有效内部样式:是写在HTML里面的,内部样式只对所在的网页有效外部样式表:如果很多网页需要用到同样的样式,将样式写在一个以.c ...
- Day13有参装饰器,三元表达式,匿名函数
多个装饰器: 加载顺序:由下而上 执行顺序:由上而下 有参装饰器: 闭包,给函数传参的一种方法 当装饰器内需要参数时,可以采用闭包形式给其传参,第三层函数接收完参数时,就变为无参装饰器 三元表达式: ...
- Python9- 生成器函数进阶-day14
生成器进阶#send的获取下一个值的效果和next基本一致,#只不过在获取下一个值的时候,给上一个值的位置穿第一个数据 使用send的注册事项: #第一次使用生成器的时候,必须用next获取下一个值 ...
- LeetCode(119) Pascal's Triangle II
题目 Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [ ...