[NOI 2018] 归程
Description
Solution
65分做法
先求出每个点到\(1\)号点的最短路,记为\(d[i]\)。然后按照海拔从大到小依次加边,并查集维护每个连通块中\(d[i]\)的最小值,并同时回答询问。
70分做法
形态为树,以\(1\)为根,询问时向上倍增。
满分做法
结合上两种做法,按照海拔建出Kruskal重构树,求出每个点子树中的\(d[i]\)最小值,询问时向上倍增。
Code
#include <queue>
#include <cstdio>
#include <algorithm>
struct Node {
int u, v, l, a;
bool operator < (const Node & rhs) const {
return a > rhs.a;
}
} a[400002];
struct Edge {
int u, v, w, nxt;
} e[800002];
struct Pair {
int x, y;
bool operator < (const Pair & rhs) const {
return x > rhs.x;
}
};
std::priority_queue<Pair> q;
int head[200002], vis[200002], d[400002], v[400002], f[400002][20], fa[400002], tot, n, m;
int read() {
int x = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
void adde(int u, int v, int w) {
e[++tot].nxt = head[u], head[u] = tot, e[tot].v = v, e[tot].w = w;
}
int find(int x) {
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void dijkstra() {
while (!q.empty()) q.pop();
for (int i = 2; i <= n; ++i) d[i] = 0x7fffffff;
q.push((Pair){0, 1});
int cnt = 0;
while (!q.empty()) {
int u = q.top().y;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
if (++cnt == n) return;
for (int i = head[u]; i; i = e[i].nxt)
if (d[e[i].v] > d[u] + e[i].w)
d[e[i].v] = d[u] + e[i].w, q.push((Pair){d[e[i].v], e[i].v});
}
}
int main() {
int T = read();
while (T--) {
n = read(), m = read(), tot = 0;
for (int i = 1; i <= n; ++i) head[i] = vis[i] = f[i][0] = 0, fa[i] = i;
for (int i = 1; i <= m; ++i) {
a[i].u = read(), a[i].v = read(), a[i].l = read(), a[i].a = read();
adde(a[i].u, a[i].v, a[i].l), adde(a[i].v, a[i].u, a[i].l);
}
dijkstra();
std::sort(a + 1, a + m + 1);
int cnt = n;
for (int i = 1; i <= m; ++i) {
int x = find(a[i].u), y = find(a[i].v);
if (fa[x] == fa[y]) continue;
f[x][0] = f[y][0] = ++cnt, v[cnt] = a[i].a, d[cnt] = std::min(d[x], d[y]);
fa[x] = fa[y] = fa[cnt] = cnt, f[cnt][0] = 0;
}
for (int i = cnt; i; --i)
for (int j = 1; j <= 18; ++j)
f[i][j] = f[f[i][j - 1]][j - 1];
int q = read(), k = read(), s = read(), ans = 0;
while (q--) {
int x = (read() + k * ans - 1) % n + 1, y = (read() + k * ans) % (s + 1);
for (int i = 18; ~i; --i)
if (v[f[x][i]] > y) x = f[x][i];
printf("%d\n", ans = d[x]);
}
}
return 0;
}
[NOI 2018] 归程的更多相关文章
- [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程
[LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程 题意 给定一张无向图, 每条边有一个距离和一个高度. 再给定 \(q\) 组可能在线的询问, 每组询问给定一个点 ...
- 解题:NOI 2018 归程
题面 清新友好的题目 跑一个最短路,然后对海拔建Kruskal重构树,从最后接上去的边(最低的一个)开始DFS一下处理子树里路程的最小值. 询问是每次在重构树上倍增找到深度最浅的海拔高于当天水位线的节 ...
- NOI 2018 归程 (Kruskal重构树)
题目大意:太长了,略 Kruskal重构树,很神奇的一个算法吧 如果两个并查集被某种条件合并,那么这个条件作为一个新的节点连接两个并查集 那么在接下来的提问中,如果某个点合法,它的所有子节点也都合法, ...
- [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字
[LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...
- NOI 2018 酱油记
转眼离 NOI 2018 已经过了一个星期了,退役的我还是随便来水水吧. 语法.错字之类的可能会很多,但是我也不拘这点小节了. 恭喜 yww, zjt, sk 进队,zwl, myh au , yay ...
- [LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士
[LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士 题意 题面好啰嗦啊直接粘LOJ题面好了 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照 ...
- NOI Day1T1归程(Kruskal重构树+Dijkstra)
NOI Day1T1归程(Kruskal重构树+Dijkstra) 题目 洛谷题目传送门 题解 其实我不想写......,所以...... 挖个坑......我以后一定会补的 luogu的题解讲的还是 ...
- 【NOI 2018】归程(Kruskal重构树)
题面在这里就不放了. 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信 ...
- 「NOI 2018」归程「Kruskal 重构树」
题解 Kruskal重构树:每次一条边连接两个集合,建一个新点,点权为该边边权:把这两个集合的根连向新点. 性质:(如果求的是最大生成树)叶子结点是图中实际结点:叶子到根路径上点权递减:两点间lca的 ...
随机推荐
- 权限管理系统之SpringBoot集成LayUI实现后台管理首页
万事开头难,昨天一直在构思用户权限管理系统怎么实现,实现哪些需求,采用什么技术等,也在网上百度了好多,计划使用SpringBoot + Mybatis + thymeleaf + LayUI + S ...
- 百度官方CDN公共库(jquery、dojo、Bootstrap)
CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速. 百度公共CDN为您的应用程序提供稳定.可靠.高速的服务,包含全 ...
- Web部分
说出Servlet的生命周期,并说出Servlet和GCI的区别. Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init方法进行Servlet的初始化,请求到达时 ...
- jQuery(二)、选择器
1.#id 根据给定的ID匹配一个元素,如果选择器中包含特殊字符,可以用双斜杆(\\) 转义 如: 查找ID 为 myDiv[bar] 的元素 HTML 代码: <div id="no ...
- Swiper4.x使用方法
1.首先加载插件,需要用到的文件有swiper.min.js和swiper.min.css文件.可下载Swiper文件或使用CDN. <!DOCTYPE html> <html> ...
- 魅族5.0以上设备(亲测有效)激活Xposed框架的流程
对于喜欢研究手机的哥们来说,大多时候会使用到Xposed框架及种种功能强大的模块,对于5.0以下的系统版本,只要手机能获得ROOT权限,安装和激活Xposed框架是比较简单的,但随着系统版本的持续更新 ...
- Android视频录制从不入门到入门系列教程(一)————简介
一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...
- sql 存储过程学习
1.存储过程 存储过程可以包含数据操纵语句.变量.逻辑 控制语句等,比如:单个select语句, select语句块,select语句与逻辑控制块. 存储过程优点: 执行速度更快 允许模块化程序设计 ...
- Java Web Token - JWT
JWT认证过程:https://www.codetd.com/article/3602378 JWT官方文档:https://jwt.io/introduction/
- 【js】字符串方法
let str = 'na'; console.log(str.repeat('3'));//nanana console.log(str.startsWith('n'));//true consol ...