最小瓶颈路 加强版

重构树

最小生成树在合并 (x, y) 时,新建节点 z,link(x, z), link(y, z), 新建节点的权值为 w_{x,y}, 这样的

话任意两点的 answer 为新树上两点 lca 的权值,由于询问次数非常多,显然不可以 logn 求 lca。这里利用

RMQ 求 lca,预处理后时间复杂度 O(1)

#include <bits/stdc++.h>

const int N = 7e4 + 10, M = 1e5 + 10, Mod = 1e9 + 7;

int n, m;
struct Node {
int u, v, w;
bool operator < (const Node a) const {return w < a.w;}
} E[M];
int A, B, C, P; inline int Rand() {A = (A * B + C) % P; return A;} int fa[N << 1];
int Get(int x) {return x == fa[x] ? x : fa[x] = Get(fa[x]);} std:: vector <int> Vec[N << 1];
int tot_point;
int Val[N << 1]; void Rebuild() {
tot_point = n;
for(int i = 1; i <= (n << 1); i ++) fa[i] = i;
for(int i = 1; i <= m && tot_point != n + n - 1; i ++) {
int fau = Get(E[i].u), fav = Get(E[i].v);
if(fau != fav) {
tot_point ++;
fa[fau] = fa[fav] = tot_point;
Vec[tot_point].push_back(fau);
Vec[tot_point].push_back(fav);
Val[tot_point] = E[i].w;
}
}
} int deep[N << 1], In[N << 1], Id[N << 2];
int Tr; void Dfs(int u, int dep) {
deep[u] = dep, In[u] = ++ Tr; Id[Tr] = u;
int S = Vec[u].size();
for(int i = 0; i < S; i ++) Dfs(Vec[u][i], dep + 1), Id[++ Tr] = u;
} int f[N << 2][30], Pow[30], Log[N << 2]; #define T Tr
void Make_st() {
for(int i = 0; (Pow[i] = (1 << i)) <= T; i ++);
Log[1] = 0;
for(int i = 2; i <= T; i ++) Log[i] = Log[i >> 1] + 1;
for(int i = 1; i <= T; i ++) f[i][0] = Id[i];
for(int i = 1; Pow[i] <= T; i ++)
for(int j = 1, ti = T - Pow[i] + 1; j <= ti; j ++)
f[j][i] = (deep[f[j][i - 1]] < deep[f[j + Pow[i - 1]][i - 1]] ? f[j][i - 1] : f[j + Pow[i - 1]][i - 1]);
} int main() {
std:: cin >> n >> m;
for(int i = 1; i <= m; i ++) {
int u, v, w; std:: cin >> u >> v >> w;
E[i] = (Node) {u, v, w};
}
std:: sort(E + 1, E + m + 1);
Rebuild();
Dfs(tot_point, 1);
Make_st();
int Q; std:: cin >> Q;
std:: cin >> A >> B >> C >> P;
int Ans = 0;
for(; Q; Q --) {
int _1 = Rand() % n + 1, _2 = Rand() % n + 1;
int u = In[_1], v = In[_2];
if(u == v) continue;
if(u > v) std:: swap(u, v);
int t;
int ID = f[u][t = Log[v - u + 1]];
if(deep[ID] > deep[f[v - Pow[t] + 1][t]]) ID = f[v - Pow[t] + 1][t];
if((Ans += Val[ID]) >= Mod) Ans -= Mod;
}
std:: cout << Ans;
return 0;
}

loj #137 and #6021的更多相关文章

  1. LOJ#137. 最小瓶颈路 加强版(Kruskal重构树 rmq求LCA)

    题意 三倍经验哇咔咔 #137. 最小瓶颈路 加强版 #6021. 「from CommonAnts」寻找 LCR #136. 最小瓶颈路 Sol 首先可以证明,两点之间边权最大值最小的路径一定是在最 ...

  2. loj#137 最小瓶颈路 加强版

    分析 我们知道答案一定再最小生成树上 于是我们按边权从小到大建立kruskal重构树 然后每次查询lca的值即可 由于询问较多采用st表维护lca 代码 格式化代码 #include<bits/ ...

  3. LOJ题解#136. 最小瓶颈路 DFS+Kruskal

    题目链接: https://loj.ac/problem/136 思路: 在我的这篇博客中已经讲到什么是最短瓶颈路,同时给出了一个用Kruskal求最短瓶颈路的一个简洁易懂的方法,然而这道题目可以看作 ...

  4. leetcode 137

    137. Single Number II Given an array of integers, every element appears three times except for one. ...

  5. TCP和UDP的135、137、138、139、445端口的作用

    如果全是2000以上的系统,可以关闭137.138.139,只保留445 如果有xp系统,可能以上四个端口全部要打开 无论你的服务器中安装的是Windows 2000 Server,还是Windows ...

  6. [Swust OJ 137]--波浪数(hash+波浪数构造)

    题目链接:http://acm.swust.edu.cn/problem/137/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  7. Leetcode 136 137 260 SingleNumber I II III

    Leetccode 136 SingleNumber I Given an array of integers, every element appears twice except for one. ...

  8. Apache2.4 137行 httpd-ahssl.conf

    C:\Users\Administrator>E:\PHP\Apache24\bin\httpd.exe -w -n "apache2.4" -k startAH00526: ...

  9. 预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445端口

    预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445等端口   如果这种网络端口关闭方法行不通,可以尝试一种新的关闭网络端口方法(比较繁琐)见106楼,补丁安装教程见126 ...

随机推荐

  1. SpringBoot 返回Json实体类属性大小写问题

    今天碰到的问题,当时找了半天为啥前台传参后台却接收不到,原来是返回的时候返回小写,但是前台依旧大写传参. 查了很多后发现其实是json返回的时候把首字母变小写了,也就是Spring Boot中Jack ...

  2. 气象netCDF数据可视化分析

    气象netCDF数据可视化分析 2019-09-19 15:34:22 自走棋 阅读数 162更多 分类专栏: web前端   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载 ...

  3. Disruptor底层源码解析(九)

    架构图: 性能为什么这么牛逼: public void sendData(ByteBuffer data) { //1 在生产者发送消息的时候, 首先 需要从我们的ringBuffer里面 获取一个可 ...

  4. Java身份证处理工具

    身份证处理工具 /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * & ...

  5. .net core使用ocelot---第四篇 限流熔断

    简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证 .net core使用ocelot---第三篇 日志记录 前几篇文章我们陆续介 ...

  6. 【kubernetes】通过rancher2部署k8s

    1. K8S相关介绍 十分钟带你理解Kubernetes核心概念 2. 部署rancher # 更新操作系统软件包 yum update -y # 删除历史容器及数据 docker rm -f $(d ...

  7. Javap与JVM指令

    一.javap命令简述 javap是jdk自带的反解析工具.它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令).本地变量表.异常表和代码行偏移量映射表.常量池等等信息.当 ...

  8. aiohttp你不知道的异步操作网络请求

    aiohttp支持异步操作的网络请求的模块 1.一个简单异步协程爬取 read() text(encoding=编码) 比如:await r.text(encoding="utf-8&quo ...

  9. 6.transform?animation?区别?animation-duration【CSS】

    1.Transform:它和width.left一样,定义了元素很多静态样式实现变形.旋转.缩放.移位及透视等功能,通过一系列功能的组合我们可以实现很炫酷的静态效果(非动画).  2.Animatio ...

  10. React 中的 定义组件的 两种方式

    React 中创建 Components 的方式有两种:Function and Class 定义一个组件最简单的方法就是写一个 JavaScript 函数 function Welcome(prop ...