题目链接: http://codeforces.com/problemset/problem/593/D

---------------------------------------------------------------------------------------------------------------

刚看完题目感觉必须用树链剖分之类的方法,就放弃了,然而我们要发现题目具有如下性质:

一个$ long long $以内的数如果被大于$1$的数除 几十次就可以除到$0$了

所以就可以考虑下$LCA$

但如果长度为$1$的边过多 复杂度又不靠谱了 这时我们又会观察到修改时边的长度只减不增

因此对于长度为$1$的边 我们可以进行路径压缩

不过这里的压缩并不是改变原来的树的结构 因为改变树的结构就会麻烦许多

我们只需把以长度为$1$的边相连的点放在一个集合内, 如果集合内的一个点需要向上查找

就直接找到这个集合的顶端

$($尽管集合顶端的点并不一定是两点的$LCA $但由于集合内的边长均为$1$ 实际结果是等价的$)$

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 2e5 + ;
int firste[N], nexte[N << ], v[N << ];
long long w[N << ];
int fa[N], d[N], aim[N], fa2[N];
long long dist[N];
int n, m, e = ;
void build_edge(int x, int y, long long z)
{
nexte[++e] = firste[x];
firste[x] = e;
v[e] = y;
w[e] = z;
}
int findf(int x)
{
if(fa2[x] == x)
return x;
return fa2[x] = findf(fa2[x]);
}
void dfs(int u)
{
for(int p = firste[u]; p; p = nexte[p])
if(!fa[v[p]])
{
aim[p / ] = v[p];
fa[v[p]] = u;
d[v[p]] = d[u] + ;
dist[v[p]] = w[p];
if(w[p] == )
fa2[v[p]] = findf(u);
dfs(v[p]);
}
}
long long check(int x, int y, long long z)
{
while(x != y)
{
if(d[x] < d[y])
swap(x, y);
if(dist[x] == )
x = findf(x);
else
{
z /= dist[x];
x = fa[x];
if(!z)
return z;
}
}
return z;
}
int main()
{
scanf("%d%d", &n, &m);
int x, y;
long long z;
for(int i = ; i < n; ++i)
{
scanf("%d%d%lld", &x, &y, &z);
build_edge(x, y, z);
build_edge(y, x, z);
}
fa[] = ;
dist[] = ;
for(int i = ; i <= n; ++i)
fa2[i] = i;
dfs();
while(m--)
{
scanf("%d", &x);
if(x & )
{
scanf("%d%d%lld", &x, &y, &z);
printf("%lld\n", check(x, y, z));
}
else
{
scanf("%d%lld", &x, &z);
int u = aim[x];
dist[u] = z;
if(z == )
fa2[u] = findf(fa[u]);
}
}
return ;
}

最新文章

  1. c++ 解包tar
  2. c#语句 随堂练习1
  3. LINUNX下PHP下载中文文件名代码
  4. 剑指 offer set 3 旋转数组的最小数字
  5. cocos2d-x 2.2.3 之菜单分析(1)
  6. MAMP显示文件列表
  7. 操作MongoDB数据库知识点
  8. C# 高级编程04----类
  9. 2016 西普杯丶天津CTF预选赛(3/6)
  10. github node.js
  11. python学习笔记(1)--python特点
  12. Android @id和@+id区别
  13. (转)JVM——自定义类加载器
  14. django----对model查询扩展
  15. vue实用组件——页面公共头部
  16. C#:文件、byte[]、Stream相互转换
  17. jsonp跨域简单应用(一)
  18. Vue2.0原理-指令
  19. 闲谈:乌云上那些 web-based 的 QQ 漏洞
  20. JS时间和字符串的相互转换 Date+String

热门文章

  1. Django first()和last() F查询以及Q查询
  2. C++中使用CMake编译管理项目
  3. Mysql基础篇(笔记)
  4. 2.openshift授权策略和scc理解
  5. P4036 [JSOI2008]火星人(splay+hash+二分)
  6. idea 创建 SSM + maven Java Web 项目流程
  7. 1.报表TIBCO Jaspersoft Studio工具教程入门--生成jrxml和jasper文件 然后拖拽到项目中 跟ireport一样
  8. 解决WordPress设置错误的url网站不能访问
  9. 2018-2-13-win10-uwp-分治法
  10. 2018-8-10-win10-UWP-序列化