CodeForces 593D Happy Tree Party
2024-09-06 02:03:11
题目链接: 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 ;
}
最新文章
- c++ 解包tar
- c#语句 随堂练习1
- LINUNX下PHP下载中文文件名代码
- 剑指 offer set 3 旋转数组的最小数字
- cocos2d-x 2.2.3 之菜单分析(1)
- MAMP显示文件列表
- 操作MongoDB数据库知识点
- C# 高级编程04----类
- 2016 西普杯丶天津CTF预选赛(3/6)
- github node.js
- python学习笔记(1)--python特点
- Android @id和@+id区别
- (转)JVM——自定义类加载器
- django----对model查询扩展
- vue实用组件——页面公共头部
- C#:文件、byte[]、Stream相互转换
- jsonp跨域简单应用(一)
- Vue2.0原理-指令
- 闲谈:乌云上那些 web-based 的 QQ 漏洞
- JS时间和字符串的相互转换 Date+String
热门文章
- Django first()和last() F查询以及Q查询
- C++中使用CMake编译管理项目
- Mysql基础篇(笔记)
- 2.openshift授权策略和scc理解
- P4036 [JSOI2008]火星人(splay+hash+二分)
- idea 创建 SSM + maven Java Web 项目流程
- 1.报表TIBCO Jaspersoft Studio工具教程入门--生成jrxml和jasper文件 然后拖拽到项目中 跟ireport一样
- 解决WordPress设置错误的url网站不能访问
- 2018-2-13-win10-uwp-分治法
- 2018-8-10-win10-UWP-序列化