loj #137 and #6021
最小瓶颈路 加强版
重构树
最小生成树在合并 (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的更多相关文章
- LOJ#137. 最小瓶颈路 加强版(Kruskal重构树 rmq求LCA)
题意 三倍经验哇咔咔 #137. 最小瓶颈路 加强版 #6021. 「from CommonAnts」寻找 LCR #136. 最小瓶颈路 Sol 首先可以证明,两点之间边权最大值最小的路径一定是在最 ...
- loj#137 最小瓶颈路 加强版
分析 我们知道答案一定再最小生成树上 于是我们按边权从小到大建立kruskal重构树 然后每次查询lca的值即可 由于询问较多采用st表维护lca 代码 格式化代码 #include<bits/ ...
- LOJ题解#136. 最小瓶颈路 DFS+Kruskal
题目链接: https://loj.ac/problem/136 思路: 在我的这篇博客中已经讲到什么是最短瓶颈路,同时给出了一个用Kruskal求最短瓶颈路的一个简洁易懂的方法,然而这道题目可以看作 ...
- leetcode 137
137. Single Number II Given an array of integers, every element appears three times except for one. ...
- TCP和UDP的135、137、138、139、445端口的作用
如果全是2000以上的系统,可以关闭137.138.139,只保留445 如果有xp系统,可能以上四个端口全部要打开 无论你的服务器中安装的是Windows 2000 Server,还是Windows ...
- [Swust OJ 137]--波浪数(hash+波浪数构造)
题目链接:http://acm.swust.edu.cn/problem/137/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- Leetcode 136 137 260 SingleNumber I II III
Leetccode 136 SingleNumber I Given an array of integers, every element appears twice except for one. ...
- Apache2.4 137行 httpd-ahssl.conf
C:\Users\Administrator>E:\PHP\Apache24\bin\httpd.exe -w -n "apache2.4" -k startAH00526: ...
- 预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445端口
预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445等端口 如果这种网络端口关闭方法行不通,可以尝试一种新的关闭网络端口方法(比较繁琐)见106楼,补丁安装教程见126 ...
随机推荐
- js指定日期时间加一天 ,判断指定时间是否为周末
function dateAdd(startDate) { startDate = new Date(startDate); startDate = +startDate + ***; startDa ...
- Jmeter_自带脚本录制
1.http请求+查看结果树 代理服务器操作步骤 1.创建一个线程组(右键点击“测试计划“---> ”添加“ ---> ”线程组“) 2.创建一个http代理服务器(右键“测试计划”--& ...
- LOJ6300 博弈论与概率统计 组合、莫队
传送门 如果在\(0\)以下之后仍然会减分,那么最后的结果一定是\(N-M\). 注意到如果在Alice分数为\(0\)时继续输,那么就相当于减少了一次输的次数.也就是说如果说在总的博弈过程中,Ali ...
- 同一个Tomcat部署多个springboot项目问题
2018-12-13 10:37:21,412 ERROR [localhost-startStop-2] c.a.d.s.DruidDataSourceStatManager [DruidDataS ...
- tomcat线程池调优
之前项目一直在tomcat下开发,后来在上线之前,需要进行性能安全测试,可是测试的同事反应,登陆口线程并发一多的时候,系统立马就没法登陆了. 中间件是tomcat6. tomcat的日志总是简洁的很 ...
- usercript and passwdcript array
usercript and passwdcript array ######################## # nsnet_usercript # xxd -g 4 -c 16 -s +$(( ...
- VS2017 配置 boost_1_70
1. 下载与安装 1.1 安装方法1 (1) 下载 https://www.boost.org/ 或者使用 https://sourceforge.net/projects/boost/files/b ...
- js中this指向的三种情况
js中this指向的几种情况一.全局作用域或者普通函数自执行中this指向全局对象window,普通函数的自执行会进行预编译,然后预编译this的指向是window //全局作用域 console.l ...
- Oracle 检索数据(查询数据、select语句)
用户对表或视图最常进行的操作就是检索数据,检索数据可以通过 select 语句来实现,该语句由多个子句组成,通过这些子句完成筛选.投影和连接等各种数据操作,最终得到想要的结果. 语法: select ...
- Gradle3.0新指令api、provided、implementation等对比
Android Studio3.0正式版已经出来了,相比2.x的版本,Gradle版本也升级为了3.x,编译速度提高了不少. 在gadle3.0之后,默认的依赖由之前的compile更改为implem ...