洛谷P4768 [NOI2018]归程(Kruskal重构树)
题意
直接看题目吧,不好描述
Sol
考虑暴力做法
首先预处理出从$1$到每个节点的最短路,
对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$
考虑如何优化,这里要用到Kruskal重构树
我们按边权的海拔从大到小排序,建出Kruskal重构树
这一定是一个小根堆
那么一个点的子树内的节点一定可以相互到达且经过的最小的海拔为该点权值
那么每次查询的时候,我们只需要倍增的处理出从这个点向上走多少才不能满足条件
然后在子树内查每个点到$1$的最大值即可。
哎,调了一上午也没调出来,只有72分,可以过所有的单个数据,但是一起跑就GG,而且我本机跑大数据会RE。
继续调下去也没啥意思了,等哪天心情好了重写一遍吧。
这题直接该变我三观啊qwq。
我先是把边改成从$1$开始,然后就变成了$70$分。提示第$3$个点输出$0$,但是我本机可以过
然后我又把比较函数里的$=$去了就A了。
why????????
// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
//#define int long long
#define MP(x, y) make_pair(x, y)
#define Pair pair<int, int>
using namespace std;
const int MAXN = 1e6 + , INF = , B = ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = ; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int QwQ, N, M;
struct Edge {
int u, v, l, a, nxt;
bool operator < (const Edge &rhs) const {
return a > rhs.a;//小根堆
}
}E[MAXN << ];
int head[MAXN], num;
inline void AddEdge(int x, int y, int z, int gg) {
E[num] = (Edge){x, y, z, gg, head[x]};
head[x] = num++;
}
inline void work() {
N = read(); M = read();
for(int i = ; i <= M; i++) {
int u = read(), v = read(), l = read(), a = read();
AddEdge(u, v, l, a); AddEdge(v, u, l, a);
}
} int dis[MAXN];
void MinDisRood() {//求出从1到各个节点的最短路
memset(dis, 0x3f, sizeof(dis));
priority_queue<Pair> q;
dis[] = ; q.push(MP(, ));
while(!q.empty()) {
int p = q.top().second; q.pop();
for(int i = head[p]; i != -; i = E[i].nxt) {
int to = E[i].v;
if(dis[to] > dis[p] + E[i].l)
dis[to] = dis[p] + E[i].l, q.push(MP(-dis[to], to));
}
}
}
int fa[MAXN], cnt, g[MAXN][], f[MAXN][], ch[MAXN][], val[MAXN];
int find(int x) {
if(fa[x] == x) return fa[x];
return fa[x] = find(fa[x]);
}
void Kruskal() {
cnt = N;
for(int i = ; i <= * N + ; i++) fa[i] = i;
sort(E + , E + num);
for(int i = ; i < num; i++) {
int fx = find(E[i].u), fy = find(E[i].v);
if(fx == fy) continue;
ch[++cnt][] = fx; ch[cnt][] = fy;
fa[fx] = fa[fy] = f[fx][] = f[fy][] = cnt;
g[fx][] = g[fy][] = E[i].a;
}
}
int mi[MAXN];
int dfs(int x) {
mi[x] = INF;
if(!ch[x][] || !ch[x][]) return mi[x] = dis[x];
mi[x] = min(mi[x], dfs(ch[x][]));
mi[x] = min(mi[x], dfs(ch[x][]));
return mi[x];
}
void Pre() {
for(int j = ; j <= B; j++)
for(int i = ; i <= * N; i++)
f[i][j] = f[f[i][j - ]][j - ],
g[i][j] = min(g[i][j - ], g[f[i][j - ]][j - ]);
dfs(cnt);
}
int Find(int bg, int val) {//从bg出发网上跳,找到海拔大于val的最小的点
for(int i = B; i >= ; i--)
if(g[bg][i] > val && g[bg][i] <= INF)
bg = f[bg][i];
return bg;
}
void DealQuery() {
int Q = read(), K = read(), S = read(), lastans = ;
while(Q--) {
int v = read(), p = read();
v = (v + K * lastans - ) % N + ;
p = (p + K * lastans) % (S + );
int tot = , pos = Find(v, p);
printf("%d\n", lastans = mi[pos]); }
}
inline void init() {
memset(g, 0x3f, sizeof(g));
memset(val, , sizeof(val));
memset(head, -, sizeof(head));
memset(ch, , sizeof(ch));
memset(f, , sizeof(f));
num = ;
}
main() {
//freopen("a.in", "r", stdin);
//freopen("a.out", "w", stdout);
QwQ = read();
while(QwQ--) {
init();
work();
//if(N != 1500 || M != 2922) continue;
MinDisRood();
Kruskal();
Pre();
DealQuery();
}
return ;
}
洛谷P4768 [NOI2018]归程(Kruskal重构树)的更多相关文章
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
		
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
 - 洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树
		
正解:$kruscal$重构树 解题报告: 传送门$QwQ$ 语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$ 所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海 ...
 - LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)
		
LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...
 - [NOI2018]归程 kruskal重构树
		
[NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...
 - 洛谷 P4768 [NOI2018]归程
		
洛谷 361行代码的由来 数据分治大发好啊- NOI的签到题,可怜我在家打了一下午才搞了80分. 正解应该是kruskal重构树或排序+可持久化并查集. 我就分点来讲暴力80分做法吧(毕竟正解我也没太 ...
 - BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
		
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
 - 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]
		
题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...
 - BZOJ 5415: [Noi2018]归程(kruskal重构树)
		
解题思路 \(NOI2018\)的\(Day1\) \(T1\),当时打网络赛的时候不会做.学了一下\(kruskal\)重构树后发现问题迎刃而解了.根据\(kruskal\)的性质,如果要找从\(u ...
 - 洛谷P4197 Peaks (Kruskal重构树)
		
读题,只经过困难值小于等于x的路径,容易想到用Kruskal重构树:又要查询第k高的山峰,我们选择用主席树求解. 先做一棵重构树,跑一遍dfs,重构树中每一个非叶子节点对应一段区间,我们开range[ ...
 
随机推荐
- rabbitmq系统学习(三)集群架构
			
RabbitMQ集群架构模式 主备模式 实现RabbitMQ的高可用集群,一般在并发和数据量不高的情况下,这种模型非常的好用且简单.主备模式也称为Warren模式 HaProxy配置 listen r ...
 - centos 安装setup命令的方法
			
yum -y install setuptool 安装setup命令工具 yum -y install ntsysv 安装setup工具配套的系统服务组件 yum -y install system- ...
 - 长沙IT二十年
			
长沙IT二十年 古语有云“近代中国,湖南独撑半边天”,近代中国以来,多少仁人志士从湖湘这片热土出发,在中华大地上,挥毫泼墨,为中华民族的繁荣昌盛做出了不可磨灭的贡献.而今天,随着互联网时代的到来,长沙 ...
 - python基础-字符串(6)
			
一.引言 当打来浏览器登录某些网站的时候,需要输入密码,浏览器把密码传送到服务器后,服务器会对密码进行验证,其验证过程是把之前保存的密码与本次传递过去的密码进行对比,如果相等,那么就认为密码正确,否则 ...
 - Apache Pulsar简介
			
Apache Pulsar What is Pulsar "Pulsar is a distributed pub-sub messaging platform with a very fl ...
 - 从Java小白到收获BAT等offer,分享我这两年的经验和感悟
			
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
 - 旅行,说走就走 Help? [C++数据类型和表达式]
			
摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 乐天派.我却喜欢和老妈说"老妈小时候喜欢羡慕别人有动力,现在看 ...
 - 开源任务调度平台elastic-job-lite源码解析
			
前段时间写过一遍文章<一文揭秘定时任务调度框架quartz>,有读者建议我再讲讲elastic-job这个任务调度框架,年末没有那么忙,就来学习一下elastic-job. 首先一点,el ...
 - 区块链--Ubuntu上搭建以太坊私有链
			
1.搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:https://githu ...
 - 基于SSM框架贺州学院校园二手交易平台设计与实现
			
前言 这个是我当时的毕业论文,分享出来,给同学们参考. 绪论 随着中国新四大发明的诞生,网购成了千千万万网友们购物的新方式,新的购物方式促进商业的发展,但随着人们生活水平的提高,许多新购置的物品用了没 ...