[UOJ #393]【NOI2018】归程
题目大意:有一张$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】归程的更多相关文章
- [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程
[LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程 题意 给定一张无向图, 每条边有一个距离和一个高度. 再给定 \(q\) 组可能在线的询问, 每组询问给定一个点 ...
- [NOI2018]归程 kruskal重构树
[NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- NOI2018 D1T1 [NOI2018]归程 解题报告
P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...
- BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增+最短路
BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好久不 ...
- 题解 NOI2018 归程
题解 NOI2018 归程 题意 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l, ...
- [NOI2018]归程(kruscal重构树)
[NOI2018]归程 题面太长辣,戳这里 模拟赛上写了一个spfa (关于spfa,它已经死了),然后一个st表水完暴力跑路.考后说是Kruscal重构树或者可持久化并查集???这都是些什么东西.不 ...
- [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)
[luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kru ...
- Luogu P4768 [NOI2018]归程(Dijkstra+Kruskal重构树)
P4768 [NOI2018]归程 题面 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点. \(m\) 条边的无向连通图(节点的编 ...
- P4768 [NOI2018]归程(kruskal 重构树)
洛谷P4768 [NOI2018]归程 LOJ#2718.「NOI2018」归程 用到 kruskal 重构树,所以先说这是个啥 显然,这和 kruskal 算法有关系 (废话 这个重构树是一个有点权 ...
随机推荐
- SQL基础-存储过程&触发器
一.存储过程 1.存储过程简介 存储过程: 一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,然后通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 存储过程的创建: ...
- IntelliJ IDEA 2019从入门到癫狂 图文教程!
阅读本文大概需要 6 分钟. 作者:yizhiwazi 来源:www.jianshu.com/p/9c65b7613c30 前言:IntelliJ IDEA 如果说IntelliJ IDEA是一款现代 ...
- Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)
阿里的人问我 缓存雪崩(大量数据在同一时间过期了)了如何处理,缓存击穿了如何处理,回答的很烂,做了总结: 把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数 ...
- Server Tomcat v8.5 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
Server Tomcat v9.0 Server at localhost was unable to start within 45 seconds. If the server requires ...
- 【深入学习linux】Linux系统安装
1. 配置内存大小,和设置镜像文件,开启虚拟机,点击虚拟机,立即按F2,会出现下图 2. 选择 Boot 菜单,默认是以硬盘进行启动,但是硬盘目前为空,则不能启动,需要改成以光盘形式启动即 CD-RO ...
- win7上手机ADB interface无法安装驱动
解决办法: https://blog.csdn.net/riyuexingchen1204/article/details/84594061
- PMP 第9~10章错题总结
1.组织分解结构把组织中的部门与项目中的工作包联系起来2.管理项目团队时应该使用冲突管理3.职责分配矩阵(RAM)显示了分配给每个工作包的项目资源,用于说明工作包或活动与项目团队成员之间的关系.而RA ...
- java js ur特殊格式处理 json 特殊格式处理
url特殊格式处理: js中使用 encodeURIComponent() 编码对应的value $.ajax({ type: "post", url: "/tb_are ...
- docker: 构建自己的镜像
我们给予ubuntu的镜像然后拷贝python的requirement.txt文件进去,再根据这个文件安装对应的python库 拷贝文件到docker容器.首先查找对应的容器ID.然后执行命令 doc ...
- Centos7个性化桌面美化
个人电脑系统由Windows转Kali(Linux)再转Windows,工作后因为都是接触的Centos7系统,再加上厌烦年Win10,于是再次投回LInux的怀抱,将电脑系统直接重装为Linux系统 ...