最小瓶颈路 加强版

重构树

最小生成树在合并 (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. idea单行注释优化成不在行首注释

  2. tkinter学习笔记_02

    4. 多行输入框 text # 按钮 # command 执行动作 def insert_point(): var = e.get() t.insert('insert', var) b = tk.B ...

  3. java之struts2之文件上传

    1.在大多数应用中,都有文件上传功能.有两种文件上传的方式,一种是自己去解析http协议,获取文件上传的内容.另一种是通过第三方插件来实现文件上传.第三方插件一般有两种,smartfileupload ...

  4. ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件

    原文:https://www.stevejgordon.co.uk/httpclientfactory-aspnetcore-outgoing-request-middleware-pipeline- ...

  5. python实现scp功能

    最近公司有一个需求,需要把服务器A上的任务放到服务器B上,因为B上有HTTP,并且可以被外网访问,但是直接通过shell的scp,每次都需要输入密码.这里用python简单实现一下 直接上代码: im ...

  6. 那些年,Linus torvalds大神喷过的技术

    Linus Torvalds 被认为是最伟大的程序员之一,因为他写出了使用最广泛的软件,如 Linux 内核和 Git 版本控制系统.但是他这个人经常因为讲话带有情绪,甚至是因为带有脏话的意见而饱受非 ...

  7. spring boot 使用GraphQL

    在此之前需要简单了解GraphQL的基本知识,可通过以下来源进行学习 GraphQL官方中文网站 :https://graphql.cn GraphQL-java 官网:https://www.gra ...

  8. python day4 元组/字典/集合类知识点补充

    目录 python day4 元组/字典/集合类知识点补充 1. 元组tuple知识点补充 2. 字典dict的知识点补充 3. 基本数据类型set 4. 三元运算,又叫三目运算 5. 深复制浅复制 ...

  9. 服务端php之文件上传

    知识点 echo $_SERVER['PHP_SELF']; 自动获取当前文件的路劲(即提交地址为当前页面) 当一个表单有文件域(即文件上传)的时候,method(提交方式)要设置post,这样更加安 ...

  10. React Native 开发豆瓣评分(四)集中管理 fetch 数据请求

    豆瓣评分的API接口 接口是从网上查找的,看样子应该是微信小程序里面扣出来的(ua 里面有 wechatdevtools) 接口都需要设置apiKey(054022eaeae0b00e0fc068c0 ...