题目大意:有一张$n$个点$m$条边的图,每个边有两个属性$a_i,b_i$。有$Q$个询问,每个询问给出$v,p$,表示所有边中$b_i\leqslant p$的边会被标记,在点$v$,可以通过不被标记的边到达任意点,然后用最小的$\sum a_i$到达点$1$,输出这个最小值。多组数据

$n\leqslant2\times10^5,m\leqslant4\times10^5$,最多$3$组数据。

题解:$\mathrm{kruskal}$重构树,按$b_i$从大到小建重构树,可以发现若一个点没有被标记,它的子树内均不被标记,所以可以由点$1$跑最短路,然后记录每个节点的子树内最近的值。注意,$\mathrm{SPFA}$已死,要用$\mathrm{dijkstra}$。

卡点:多组数据中清空错误

C++ Code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
const int maxn = 6e5 + 10; int Tim, n, m, N, Q, K, S, f[maxn], w[maxn];
int _u[maxn], _v[maxn], _l[maxn], _a[maxn], rnk[maxn];
inline bool cmp(int a, int b) { return _a[a] > _a[b]; }
int find(int x) { return x == f[x] ? x : (f[x] = find(f[x])); }
long long dis[maxn]; namespace Graph {
int head[maxn], cnt;
struct Edge {
int to, nxt, w;
} e[maxn << 1];
void addedge(int a, int b, int c) {
e[++cnt] = (Edge) { b, head[a], c }; head[a] = cnt;
e[++cnt] = (Edge) { a, head[b], c }; head[b] = cnt;
}
void clear() { memset(head, 0, sizeof head), cnt = 0; } int V[maxn << 2];
inline int getmin(int a, int b) { return dis[a] < dis[b] ? a : b; }
void modify(int rt, int l, int r, int p, int v) {
if (l == r) { V[rt] = v; return ; }
int mid = l + r >> 1;
if (p <= mid) modify(rt << 1, l, mid, p, v);
else modify(rt << 1 | 1, mid + 1, r, p, v);
V[rt] = getmin(V[rt << 1], V[rt << 1 | 1]);
} void dijkstra(int S) {
memset(dis, 0x3f, sizeof dis), memset(V, 0, sizeof V);
dis[S] = 0, modify(1, 1, n, S, S);
for (int Tim = n; Tim; --Tim) {
int u = V[1]; modify(1, 1, n, u, 0);
for (int i = head[u], v; i; i = e[i].nxt) {
v = e[i].to;
if (dis[v] > dis[u] + e[i].w)
dis[v] = dis[u] + e[i].w, modify(1, 1, n, v, v);
}
}
}
} const int M = 24;
int fa[maxn][M + 1];
void addedge(int a, int b) {
fa[b][0] = a, dis[a] = std::min(dis[a], dis[b]);
}
long long query(int v, int p) {
for (int i = M; ~i; --i) if (w[fa[v][i]] > p) v = fa[v][i];
return dis[v];
} int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> Tim;
while (Tim --> 0) {
Graph::clear(), w[0] = -0x3f3f3f3f, memset(fa, 0, sizeof fa); std::cin >> n >> m, N = n;
for (int i = 0, l; i < m; ++i) {
std::cin >> _u[i] >> _v[i] >> l >> _a[i];
Graph::addedge(_u[i], _v[i], l);
rnk[i] = i;
}
Graph::dijkstra(1); for (int i = 1; i <= n + m; ++i) f[i] = i;
std::sort(rnk, rnk + m, cmp);
for (int i = 0, u, v; i < m; ++i) {
u = find(_u[rnk[i]]), v = find(_v[rnk[i]]);
if (u != v) {
addedge(++N, u), addedge(N, v);
w[N] = _a[rnk[i]], f[u] = f[v] = N;
}
}
for (int i = 1; i <= M; ++i)
for (int j = 1; j <= N; ++j)
fa[j][i] = fa[fa[j][i - 1]][i - 1]; std::cin >> Q >> K >> S;
long long v, p, ans = 0;
while (Q --> 0) {
std::cin >> v >> p;
if (K) v = (v + ans - 1) % n + 1,
p = (p + ans) % (S + 1);
ans = query(v, p);
std::cout << ans << '\n';
}
}
return 0;
}

  

[UOJ #393]【NOI2018】归程的更多相关文章

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

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

  2. [NOI2018]归程 kruskal重构树

    [NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...

  3. [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)

    洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...

  4. NOI2018 D1T1 [NOI2018]归程 解题报告

    P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...

  5. BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增+最短路

    BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好久不 ...

  6. 题解 NOI2018 归程

    题解 NOI2018 归程 题意 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l, ...

  7. [NOI2018]归程(kruscal重构树)

    [NOI2018]归程 题面太长辣,戳这里 模拟赛上写了一个spfa (关于spfa,它已经死了),然后一个st表水完暴力跑路.考后说是Kruscal重构树或者可持久化并查集???这都是些什么东西.不 ...

  8. [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)

    [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kru ...

  9. Luogu P4768 [NOI2018]归程(Dijkstra+Kruskal重构树)

    P4768 [NOI2018]归程 题面 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点. \(m\) 条边的无向连通图(节点的编 ...

  10. P4768 [NOI2018]归程(kruskal 重构树)

    洛谷P4768 [NOI2018]归程 LOJ#2718.「NOI2018」归程 用到 kruskal 重构树,所以先说这是个啥 显然,这和 kruskal 算法有关系 (废话 这个重构树是一个有点权 ...

随机推荐

  1. linux命令之------touch命令

    touch命令 1)    作用:用于修改文件或目录的时间属性,包括存取时间和更改时间.若文件不存在,系统会建立一个新的文件. 2)    -a:改变档案的读取时间记录: 3)    -m:改变档案的 ...

  2. 前端零基础入门:页面结构层HTML

    HTML页面结构层HTML 分以下方面学习: HTML基础, HTML表格, HTML表单, 搭建网页结构 html基础 学习前端的第一门课程,为HTML基础,HTML标记语言,它是网页制作的第一步. ...

  3. SSL证书创建与部署

    SSL证书简介SSL证书创建SSL证书部署-NginxSSL证书部署-ApacheSSL证书部署-Tomcat SSL简介以及发展SSL协议原理SSL应用场景 SSL简介以及发展传输层安全性协议,以及 ...

  4. [2019BUAA软件工程]个人期末总结感想

    写在前面   经过一学期对于软件工程的学习,笔者完成了一次结对编程以及三个周期的敏捷开发流程.在本博客中笔者对于一学期的学习进行了总结,并对于自己最初的疑惑做出了回答.   笔者在学期开始前应课程要求 ...

  5. bind named.conf 的理解

    [root@46 /]#yum -y install bind bind-chroot bind-libs bind-utils caching-nameserver目录说明/var/named/ch ...

  6. 图形化SQL JOIN

  7. CentOS6非root用户下安装及配置CDH5.3.0

    #install lsb packagesudo yum install -y redhat-lsb #install net-tools package sudo yum install -y ne ...

  8. 设置ESXi宿主机开机自动启动虚拟机

    转载于 https://blog.csdn.net/Form_/article/details/71170813 在百度上面找了一圈都是讲ESXi6.0之前的版本,在VMware vSphere Cl ...

  9. Qt编写安防视频监控系统(界面很漂亮)

    一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...

  10. [转].gitignore文件不起作用的解决方案

    .gitignore文件不起作用的解决方案 觉得有用的话,欢迎一起讨论相互学习~Follow Me 转载地址 https://www.cnblogs.com/liugp/p/10399282.html ...