Solution -「NOI 2018」「洛谷 P4768」归程
\(\mathcal{Description}\)
Link.
给定一个 \(n\) 个点 \(m\) 条边的无向连通图,边形如 \((u,v,l,a)\)。每次询问给出 \(u,p\),回答所有从 \(u\) 出发,只经过 \(a\) 值 \(>p\) 的边能够到达的点中,到 \(1\) 号点的最小距离(以 \(l\) 之和为路径距离)。强制在线,多测。
\(n\le2 \times 10^5\),\(m,q\le4 \times 10^5\)。
\(\mathcal{Solution}\)
Kruskal 生成树的板子,还是当做算法总结写一下吧。(
Kruskal 生成树就是在用 Kruskal 求最小(最大)生成树时,以加入边的边权作为虚点点权,并从虚点连向左右两个联通块的根,使虚点成为新连通块的根,最终构成的一棵大根(小根)树堆。
对于本题,构最大生成树,答案即为子树内点到 \(1\) 最短路的最小值。复杂度 \(\mathcal O(T\left((n+q)\log n+m\log m\right))\)。
\(\mathcal{Code}\)
/* Clearink */
#include <queue>
#include <cstdio>
#include <algorithm>
typedef std::pair<int, int> pii;
typedef std::pair<int, std::pair<int, int> > EdgeT;
inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
}
inline void wint ( int x ) {
if ( x < 0 ) putchar ( '-' ), x = -x;
if ( 9 < x ) wint ( x / 10 );
putchar ( x % 10 ^ '0' );
}
inline void chkmin ( int& a, const int b ) { a > b ? a = b : 0; }
const int MAXN = 4e5, MAXLG = 18;
int n, m, node, len[MAXN + 5], val[MAXN + 5], dist[MAXN + 5];
int fa[MAXN + 5][MAXLG + 5], mndist[MAXN + 5];
EdgeT edge[MAXN + 5];
struct Graph {
int ecnt, head[MAXN + 5], to[MAXN * 2 + 5], nxt[MAXN * 2 + 5];
Graph (): ecnt ( 1 ) {}
inline void link ( const int s, const int t ) {
to[++ ecnt] = t, nxt[ecnt] = head[s];
head[s] = ecnt;
}
} G, T;
struct DSU {
int fa[MAXN + 5];
inline int find ( const int x ) { return x ^ fa[x] ? fa[x] = find ( fa[x] ) : x; }
} dsu;
inline void buildKT () {
node = n;
std::sort ( edge + 1, edge + m + 1, []( const auto& a, const auto& b ) {
return a.first > b.first;
} );
for ( int i = 1; i <= n; ++ i ) dsu.fa[i] = i;
for ( int i = 1, u, v; i <= m; ++ i ) {
if ( ( u = dsu.find ( edge[i].second.first ) )
!= ( v = dsu.find ( edge[i].second.second ) ) ) {
val[++ node] = edge[i].first;
dsu.fa[u] = dsu.fa[v] = dsu.fa[node] = node;
T.link ( node, u ), T.link ( node, v );
}
}
}
inline void Dijkstra () {
static bool vis[MAXN + 5];
static std::priority_queue<pii, std::vector<pii>, std::greater<pii> > heap;
for ( int i = 1; i <= n; ++ i ) dist[i] = -1, vis[i] = false;
heap.push ( { dist[1] = 0, 1 } );
while ( !heap.empty () ) {
pii p ( heap.top () ); heap.pop ();
if ( vis[p.second] ) continue;
vis[p.second] = true;
for ( int i = G.head[p.second], v; i; i = G.nxt[i] ) {
if ( int t = p.first + len[i >> 1]; !~dist[v = G.to[i]] || dist[v] > t ) {
heap.push ( { dist[v] = t, v } );
}
}
}
}
inline void prepKT ( const int u ) {
for ( int i = 1; i <= 18; ++ i ) fa[u][i] = fa[fa[u][i - 1]][i - 1];
mndist[u] = u <= n ? dist[u] : 0x7fffffff;
for ( int i = T.head[u], v; i; i = T.nxt[i] ) {
fa[v = T.to[i]][0] = u, prepKT ( v );
chkmin ( mndist[u], mndist[v] );
}
}
inline int climb ( int u, const int p ) {
for ( int i = 18; ~i; -- i ) if ( fa[u][i] && val[fa[u][i]] > p ) u = fa[u][i];
return u;
}
inline void clear () {
G.ecnt = T.ecnt = 1;
for ( int i = 1; i <= node; ++ i ) G.head[i] = T.head[i] = 0;
}
int main () {
for ( int T = rint (); T --; ) {
clear ();
n = rint (), m = rint ();
for ( int i = 1, u, v, a; i <= m; ++ i ) {
u = rint (), v = rint (), len[i] = rint (), a = rint ();
G.link ( u, v ), G.link ( v, u ), edge[i] = { a, { u, v } };
}
buildKT (), Dijkstra (), prepKT ( node );
for ( int q = rint (), k = rint (), s = rint (), ans = 0, u, p; q --; ) {
u = ( rint () + k * ans - 1 ) % n + 1;
p = ( rint () + k * ans ) % ( s + 1 );
wint ( ans = mndist[climb ( u, p )] ), putchar ( '\n' );
}
}
return 0;
}
\(\mathcal{Details}\)
多测不清空,爆零两行泪 qwq。
Solution -「NOI 2018」「洛谷 P4768」归程的更多相关文章
- 洛谷 P4768 [NOI2018]归程
洛谷 361行代码的由来 数据分治大发好啊- NOI的签到题,可怜我在家打了一下午才搞了80分. 正解应该是kruskal重构树或排序+可持久化并查集. 我就分点来讲暴力80分做法吧(毕竟正解我也没太 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]
题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...
- 洛谷P4768 [NOI2018]归程(Kruskal重构树)
题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...
- 洛谷P4768 [NOI2018]归程(可持久化并查集,最短路)
闲话 一个蒟蒻,在网络同步赛上进行了这样的表演-- T2组合计数不会,T3字符串数据结构不会,于是爆肝T1 一开始以为整个地图都有车,然后写了2h+的树套树,终于发现样例过不去 然后写可持久化并查集D ...
- 洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)
传送门 前置技能,克鲁斯卡尔重构树 我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树 那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价) 可以一开始直接 ...
- 洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树
正解:$kruscal$重构树 解题报告: 传送门$QwQ$ 语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$ 所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海 ...
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
随机推荐
- websocket 使用 spring 的service层 ,进而调用里面的 dao层 来操作数据库 ,包括redis、mysql等通用
1.前言 描述一下今天用websocket踩得坑 --->空指针异常! 我想在websocket里面使用service 层的接口,从中获取数据库的一些信息 , 使用 @Autowired 注 ...
- Hive分析统计离线日志信息
关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...
- 解决twrp中内部存储为0MB的情况
本来打算给备用机红米4a刷个dotos的系统,结果忘记双清就刷了,然后进去系统也是直接黑屏,很神奇的是长按电源键能弹出dotos的关机选项.然后进去twrp准备双清在刷时,发现内部存储变成了0MB,然 ...
- 《剑指offer》面试题68 - II. 二叉树的最近公共祖先
问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q ...
- 【解决了一个小问题】golang中引用一个路径较长的库,导致goland中出现"module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2"
在项目中的go.mod文件中有这样一句: require ( github.com/xxx-devops/xx1/sdk/go v2.2.3 ) 项目的编译没有问题,但是goland中出现如下提示: ...
- jquery-qrcode客户端二维码生成类库扩展--融入自定义Logo图片
年后换了部门,现在主要的职责就是在网上卖精油,似乎这个就是传说中的网络营销. 跟着公司的MM们也了解不了少关于网络营销的知识,间接的了解到马云和刘强东都是些怎样龌龊的人,尽管之前也这样认为. 淘宝就不 ...
- DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ | TORCH.AUTOGRAD
torch.autograd 是PyTorch的自动微分引擎,用以推动神经网络训练.在本节,你将会对autograd如何帮助神经网络训练的概念有所理解. 背景 神经网络(NNs)是在输入数据上执行的嵌 ...
- MyCms 自媒体 CMS 系统 v2.6,SEO 优化升级
MyCms 是一款基于Laravel开发的开源免费的自媒体博客CMS系统,助力开发者知识技能变现. MyCms 基于Apache2.0开源协议发布,免费且不限制商业使用,欢迎持续关注我们. V2.6 ...
- Qt之锁
mythread.h: #ifndef MYTHREAD_H #define MYTHREAD_H #include <QObject> #include<QMutex> cl ...
- K8S探针和SVC,POD原理
(6)容器是否健康: spec.container.livenessProbe.若不健康,则Pod有可能被重启(可配置策略) (7)容器是否可用: spec.container.readiness ...