[JZOJ4899] 雪之国度
题目描述
雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路。雪之女王赋予了每一座城市不同的能量,其中第i座城市被赋予的能量为Wi。
如果城市u和v之间有一条道路,那么只要此刻雪之女王的能量不小于|Wu-Wv|,这条道路就是安全的。如果城市u和v之间存在两条没有重复道路的安全路径(其中每一段道路都是安全的),则认为这两座城市之间有着良好的贸易关系。
最近,雪之女王因为情感问题,她的能量产生巨大的波动。为了维持雪之国度的经济贸易,她希望你能帮忙对Q对城市进行调查。对于第j对城市uj和vj,她希望知道在保证这两座城市之间有着良好贸易关系的前提之下,自己最少需要保持多少的能量。
数据范围
对于 $20\%$ 的数据,$3 \leq N \leq 10$,$3 \leq M \leq 20$,$1 \leq Q \leq 10$
对于另 $30\%$ 的数据,$W=0$
对于 $100\%$ 的数据,$3 \leq N \leq 10^5$,$3 \leq M \leq 5 \times 10^5$,$1 \leq Q \leq 10^5$
分析
这题大意就是问至少经过权值为多少的边,使得两点之间存在两条不经过重复边的路径(边双)
首先可以建一棵最小生成树,这样每两个点之间有且仅有一条路径,而且权值最大的边一定是在另一条路径(非树边)上
然后从小到大依次加入非树边,每次加入边一定会形成一个环,由于最小生成树上的边权对答案是无意义的,所以我们可以直接把环上所有没更新过的树边的权值更新为该非树边的权值
但是如果每次都把环上的所有路径走一遍,就很容易超时,所以需要用并查集维护已经更新过的点,这样就不会对一条边重复访问了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100005
#define M 500005
#define T 17 int n, m, q, tot = , cnt;
int to[M << ], nxt[M << ], head[N];
int fa[N], val[N], used[M], d[N];
int f[N][], g[N][]; struct Edge {
int u, v, w;
} e[M]; bool cmp(Edge a, Edge b) {
return a.w < b.w;
} void add(int u, int v) {
to[++tot] = v; nxt[tot] = head[u]; head[u] = tot;
} int find(int x) {
if (x == fa[x]) return x;
return fa[x] = find(fa[x]);
} void dfs(int x, int ff) {
d[x] = d[ff] + ; f[x][] = ff;
for (int i = ; ( << i) < d[x]; i++)
f[x][i] = f[f[x][i - ]][i - ];
for (int i = head[x]; i; i = nxt[i])
if (to[i] != ff) dfs(to[i], x);
} int lca(int x, int y) {
int ans = ;
if (d[x] < d[y]) swap(x, y);
for (int i = T; i >= ; i--)
if (d[f[x][i]] >= d[y])
ans = max(ans, g[x][i]), x = f[x][i];
if (x == y) return ans;
for (int i = T; i >= ; i--)
if (f[x][i] != f[y][i]) {
ans = max(ans, max(g[x][i], g[y][i]));
x = f[x][i]; y = f[y][i];
}
ans = max(ans, max(g[x][], g[y][]));
return ans;
} int main() {
scanf("%d%d%d", &n, &m, &q);
for (int i = ; i <= n; i++)
scanf("%d", val + i);
for (int i = ; i <= m; i++) {
scanf("%d%d", &e[i].u, &e[i].v);
e[i].w = abs(val[e[i].u] - val[e[i].v]);
}
sort(e + , e + m + , cmp);
for (int i = ; i <= n; i++) fa[i] = i;
for (int i = ; i <= m; i++) {
int x = find(e[i].u), y = find(e[i].v);
if (x == y) continue;
fa[x] = y; used[i] = ;
add(e[i].u, e[i].v);
add(e[i].v, e[i].u);
}
dfs(, );
for (int i = ; i <= n; i++) fa[i] = i;
for (int i = ; i <= m; i++) {
if (used[i]) continue;
int x = find(e[i].u), y = find(e[i].v);
while (x != y) {
if (d[x] < d[y]) swap(x, y);
g[x][] = max(g[x][], e[i].w);
fa[x] = f[x][]; x = find(x);
}
}
for (int i = ; i <= T; i++)
for (int j = ; j <= n; j++)
g[j][i] = max(g[j][i - ], g[f[j][i - ]][i - ]);
while (q--) {
int x, y;
scanf("%d%d", &x, &y);
if (find(x) != find(y)) printf("infinitely\n");
else printf("%d\n", lca(x, y));
} return ;
}
[JZOJ4899] 雪之国度的更多相关文章
- 【JZOJ4899】【NOIP2016提高A组集训第17场11.16】雪之国度
题目描述 雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路.雪之女王赋予了每一座城市不同的能量,其中第i座城 ...
- [51nod1743]雪之国度
雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路. 雪之女王赋予了每一座城市不同的能量,其中第i座城市被赋予 ...
- 【51nod1743】雪之国度(最小生成树+倍增)
点此看题面 大致题意: 给你一张无向连通图,其中每条边的边权为这条边连接的两点的权值之差.每次询问两点之间是否存在两条不重复的路径,若存在则输出这两条路径上最大值的最小值. 大致思路 这题显然就是要让 ...
- 【HHHOJ】NOIP2018 模拟赛(二十五) 解题报告
点此进入比赛 得分: \(100+100+20=220\)(\(T1\)打了两个小时,以至于\(T3\)没时间打了,无奈交暴力) 排名: \(Rank\ 8\) \(Rating\):\(+19\) ...
- NOIP2018赛前停课集训记(10.24~11.08)
前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃 ...
- 用FSM一键制作逐帧动画雪碧图 Vue2 + webpack
因为工作需要要将五六十张逐帧图拼成雪碧图,网上想找到一件制作工具半天没有找到,就自己用canvas写了一个. 写成之后就再没有什么机会使用了,因此希望有人使用的时候如果遇到bug了能及时反馈给我. 最 ...
- 将MPM雪模拟移植到Maya
同事实现了一个迪士尼的MPM雪模拟论文,我将其移植到Maya中 论文题目是 A material point method for snow simulation 代码在这里: https://git ...
- BZOJ 1006 【HNOI2008】 神奇的国度
题目链接:神奇的国度 一篇论文题--神奇的弦图,神奇的MCS-- 感觉我没有什么需要多说的,这里简单介绍一下MCS: 我们给每个点记录一个权值,从后往前依次确定完美消除序列中的点,每次选择权值最大的一 ...
- 原创:CSS3技术-雪碧图自适应缩放与精灵动画方案
花了一个礼拜完成了慕课网定制的七夕主题效果,其中有一个没实现好的功能,就是雪碧图的自适应缩放 ps: 以下实现都是基于移动端的处理 原图如下: 人物是采用的是雪碧图,通过坐标绝对数据取值 问题很明显, ...
随机推荐
- SQL中的事务ACID
概述: 事务是由一系列语句构成的逻辑工作单元.事务和存储过程等批处理有一定程度上的相似之处, 通常都是为了完成一定业务逻辑而将一条或者多条语句“封装”起来,使它们与其他语句之间出现一个逻辑上的边界,并 ...
- PRML学习准备
因为很怕PRML课程,所以想提前学习下做点准备. 看的一个学习内容就是python数据处理那本书,比较仔细地学习了 numpy,大致看了pandas和 matplotlib ,有以下几点感受 nump ...
- Bootstrap 手机屏幕自适应的响应式布局开关
head中添加 <meta name="viewport" content="width=device-width, initial-scale=1, shrink ...
- 阿里云K8S下玩.NET CORE 3.1
1. 创建阿里云K8S集群,本文以标准托管集群为例 1.1 创建一个 2台 centos 2core 4G的 k8s 集群 1.2 创建成功的模样 2. 创建 asp.net core webapi项 ...
- 【算法】——递归:小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式。
分析:从最后一步分析,能有的情况有三种情况构成,写出如图所示的方程 //和斐波拉契相似 int void f(int n) { //考虑出口 ) ;//正常思路是返回0 ) ;//通过自己想可以得出只 ...
- ThinkPHP v6.0.x 反序列化漏洞利用
前言: 上次做了成信大的安询杯第二届CTF比赛,遇到一个tp6的题,给了源码,目的是让通过pop链审计出反序列化漏洞. 这里总结一下tp6的反序列化漏洞的利用. 0x01环境搭建 现在tp新版本的官网 ...
- 将小账本上传到GitHub
在假期的时候我已经注册好了用户 https://www.cnblogs.com/1234yyf/p/12312072.html 然后我将我的小账本上传到GitHub上面:一步一步跟着就可以上传成功!! ...
- WebGL_0002:palycanvas 配置文件路径
playcanvas 配置文件路径https://s3-eu-west-1.amazonaws.com/apps.playcanvas.com/wmSPTNhb/config.jsonsence 地址 ...
- JavaScript学习—基本类型—Number
在JavaScript中,采用IEEE754表示整数和浮点数 整数 十进制 let num10 = 10 八进制 let num8 = 0(1~7) JavaScript中,八进制数值以0作为前导,后 ...
- 3个N加上各种运算符号结果等于6(纯属娱乐)C#
网上的题目: 题有点难 但都有解 2 2 2 = 6 3 3 3 = 6 4 4 4 = 6 5 5 5 = 6 6 6 ...