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] 归程的更多相关文章

  1. [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程

    [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程 题意 给定一张无向图, 每条边有一个距离和一个高度. 再给定 \(q\) 组可能在线的询问, 每组询问给定一个点 ...

  2. 解题:NOI 2018 归程

    题面 清新友好的题目 跑一个最短路,然后对海拔建Kruskal重构树,从最后接上去的边(最低的一个)开始DFS一下处理子树里路程的最小值. 询问是每次在重构树上倍增找到深度最浅的海拔高于当天水位线的节 ...

  3. NOI 2018 归程 (Kruskal重构树)

    题目大意:太长了,略 Kruskal重构树,很神奇的一个算法吧 如果两个并查集被某种条件合并,那么这个条件作为一个新的节点连接两个并查集 那么在接下来的提问中,如果某个点合法,它的所有子节点也都合法, ...

  4. [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字

    [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...

  5. NOI 2018 酱油记

    转眼离 NOI 2018 已经过了一个星期了,退役的我还是随便来水水吧. 语法.错字之类的可能会很多,但是我也不拘这点小节了. 恭喜 yww, zjt, sk 进队,zwl, myh au , yay ...

  6. [LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士

    [LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士 题意 题面好啰嗦啊直接粘LOJ题面好了 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照 ...

  7. NOI Day1T1归程(Kruskal重构树+Dijkstra)

    NOI Day1T1归程(Kruskal重构树+Dijkstra) 题目 洛谷题目传送门 题解 其实我不想写......,所以...... 挖个坑......我以后一定会补的 luogu的题解讲的还是 ...

  8. 【NOI 2018】归程(Kruskal重构树)

    题面在这里就不放了. 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信 ...

  9. 「NOI 2018」归程「Kruskal 重构树」

    题解 Kruskal重构树:每次一条边连接两个集合,建一个新点,点权为该边边权:把这两个集合的根连向新点. 性质:(如果求的是最大生成树)叶子结点是图中实际结点:叶子到根路径上点权递减:两点间lca的 ...

随机推荐

  1. python基于函数替换的热更新原理介绍

    热更新即在不重启进程或者不离开Python interpreter的情况下使得被编辑之后的python源码能够直接生效并按照预期被执行新代码.平常开发中,热更能极大提高程序开发和调试的效率,在修复线上 ...

  2. Servlet_note

    2015/8/24 Web项目目录结构:总目录my,中有WEB-INF目录,中有classes.lib两目录和web.xml文件.classes保存编译好的java文件,lib保存库文件,web.xm ...

  3. Dynamics 365-关于BPF的进一步探究

    关于BPF是什么,以及如何在CRM中配置BPF,可以参阅熊宸大神的博客Dynamics 365 Business Process Flow -- 让你不再惧怕复杂的业务流程! 1. CRM中发生了什么 ...

  4. 利用更快的r-cnn深度学习进行目标检测

    此示例演示如何使用名为“更快r-cnn(具有卷积神经网络的区域)”的深度学习技术来训练对象探测器. 概述 此示例演示如何训练用于检测车辆的更快r-cnn对象探测器.更快的r-nnn [1]是r-cnn ...

  5. JMeter写入文件

    之前我们推文讨论过如何使用jmeter读取文件, 比如csv, txt文件读取, 只要配置csv数据文件, 即可非常容易的从文件中读取想要的数据,  但是如果数据已经从API或者DB中获取, 想存放到 ...

  6. Visual Studio插件开发基础

    Visual Studio插件主要有两种:Add-in 和 VSX(Visual Studio eXtensibility) 两者区别可参考这篇文章:Visual Studio Extensions ...

  7. js实现语音功能

    在项目中需要对ajax请求返回的消息进行语音播报.那么什么录制的就是在太low啦.下面js贴代码 str 为返回的data //语音播报function voiceAnnouncements(str) ...

  8. UNIX DOMAIN SOCKET效率

    关于UNIX DOMAIN SOCKET和普通udp socket的对比 在TX1(4核A57 1.7GHz)的板卡上进行测试,每个包大小设置为1024,全速收发,UDS的速度在90Mbps左右,UD ...

  9. RabbitMQ消息模型概览(简明教程)

    小菜最近用到RabbitMQ,由于之前了解过其他消息中间件,算是有些基础,所以随手从网上搜了几篇文章,准备大概了解下RabbitMQ的消息模型,没想到网上文章千篇一律,写一大堆内容,就是说不明白到底怎 ...

  10. 吴军武志红万维刚薛兆丰何帆曾鸣李笑来罗永浩等得到APP专栏作者的书3

    整理了一下最近两三年内看过的得到APP专栏与课程作者的得到精选文集和他们写过的书共本.新增吴军1本,武志红1本. 其中:武志红3本,熊太行1本,薛兆丰2本,吴军4本,何帆3本,曾鸣2本,万维刚1本,李 ...