[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的 ...
随机推荐
- [转]使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口
本文转自:https://blog.csdn.net/yibowanbo/article/details/80521849 nodejs-koa2-mysql-sequelize-jwt技术栈:nod ...
- javascript小记四则:用JS写一个滚动横条文字,可以根据需要进行修改;
网页上的一些广告文字,一直会滚动是怎么做到的,今天给大家演示下,非常简单,源码如下(本案例是在.net平台上,但HTML是通用的): <!DOCTYPE html> <html> ...
- Excel导出数据库数据
package com.hxkr.util; import java.io.FileOutputStream; import java.util.ArrayList; import java.util ...
- SpringMVC与Struts2的主要区别
区别1: Struts2 的核心是基于一个Filter即StrutsPreparedAndExcuteFilterSpringMvc的核心是基于一个Servlet即DispatcherServlet( ...
- 通过maven profile 打包指定环境配置
背景 最近换了个新公司接手了一个老项目,然后比较坑的是这个公司的项目都没有没有做多环境打包配置,每次发布一个环境都要手动的去修改配置文件.今天正好有空就来配置下. 解决这个问题的方式有很多,我这里挑选 ...
- SwaggerAPI注解详解,以及注解常用参数配置
注解 @Api: 作用在类上,用来标注该类具体实现内容.表示标识这个类是swagger的资源 . 参数: tags:可以使用tags()允许您为操作设置多个标签的属性,而不是使用该属性. descri ...
- Android探究之ANR
什么是ANR ANR:Application Not Responding,即应用程序无响应. 在Android中,ActivityManagerService(简称AMS)和WindowManage ...
- 自学MongoDB(1)
MongoDB是nosql(非关系型数据库)中的一种,面向文档的数据库,介于传统的结构化数据库(关系型数据库)与非关系型数据库(文件储存)之间的一种,具有数据结构非常松散和非常灵活的特点;常用于存储分 ...
- winserver-查看登陆日志
Abstract 先要开启登陆审核,在查看登陆日志. 开启审核 运行 secpol.msc 日志查看 windowslog 下的security 管理员成功登陆后的eventid:4776,4648, ...
- 经典51道SQL查询练习题
数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course( ...