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. 基于ElasticStack数据分析应用系统

    1.Elasticsearch Elasticsearch 基于java,是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自 ...

  2. 实现DataTables搜索框查询结果高亮显示

    DataTables是封装好的HTML表格插件,丰富了HTML表格的样式,提供了即时搜索.分页等多种表格高级功能.用户可以编写很少的代码(甚至只是使用官方的示例代码),做出一个漂亮的表格以展示数据.关 ...

  3. selenium-webdriver的二次封装(十)

    接着上篇随笔 selenium-配置文件定位元素 ,进行了配置文件设置后,将配置文件运用到定位元素中 思路:拿到定位的 key 和 value 后,对 webdrvier 中定位进行封装,使可以直接运 ...

  4. SQLServer之创建Transact-SQL游标

    什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据 ...

  5. 分布式系统CAP理论

    在单机的数据库系统之中,我们很容易实现一套满足ACID 特性的 事务处理系统, 事务的一致性不存在问题. 但是在分布式系统之中,由于数据分布在不同的主机结点上,如何对着些数据进行分布式的事务处理就具有 ...

  6. block的注意点

    1). 在block内部使用外部指针且会造成循环引用情况下,需要用__week修饰外部指针: __weak typeof(self) weakSelf = self; 2). 在block内部如果调用 ...

  7. composer在update时提示file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO

    在开发的时候,需要把依赖的服务更新到最新,然后 手动composer update一下,提示如下: failed) Update failed (The "e "https://a ...

  8. C# -- 使用Parallel并行执行任务

    C#:使用Parallel并行执行任务 1. 代码实现 class Program { static void Main(string[] args) { TestParallel(); Consol ...

  9. 对const的总结与思考

    今天偶然想起const这一关键字,再加之以前几种const修饰指针方式让我印象深刻(混淆不清),重新回顾了一下,自己对这个关键词也又有了更加深刻的理解,所以总结一下. 一.const的定义 const ...

  10. 《JAVA程序设计》_第六周学习总结

    一.本周学习内容 1.内部类--7.1知识 在一个类的内部定义的类成为内部类,包含内部类的类叫做外嵌类 内部类和外嵌类的关系 外嵌类的成员变量在内部类中仍然有效,内部类也可调用外嵌类中的方法 内部类的 ...