题意

直接看题目吧,不好描述

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重构树)的更多相关文章

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

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

  2. 洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树

    正解:$kruscal$重构树 解题报告: 传送门$QwQ$ 语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$ 所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海 ...

  3. LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)

    LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...

  4. [NOI2018]归程 kruskal重构树

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

  5. 洛谷 P4768 [NOI2018]归程

    洛谷 361行代码的由来 数据分治大发好啊- NOI的签到题,可怜我在家打了一下午才搞了80分. 正解应该是kruskal重构树或排序+可持久化并查集. 我就分点来讲暴力80分做法吧(毕竟正解我也没太 ...

  6. BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra

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

  7. 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]

    题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...

  8. BZOJ 5415: [Noi2018]归程(kruskal重构树)

    解题思路 \(NOI2018\)的\(Day1\) \(T1\),当时打网络赛的时候不会做.学了一下\(kruskal\)重构树后发现问题迎刃而解了.根据\(kruskal\)的性质,如果要找从\(u ...

  9. 洛谷P4197 Peaks (Kruskal重构树)

    读题,只经过困难值小于等于x的路径,容易想到用Kruskal重构树:又要查询第k高的山峰,我们选择用主席树求解. 先做一棵重构树,跑一遍dfs,重构树中每一个非叶子节点对应一段区间,我们开range[ ...

随机推荐

  1. 常见的anaconda的操作

    以前对anaconda的理解比较少,以为它就是一个比较大的python库,现在发现它原来不止是这样,它还有很多其他用途. Anaconda指的是一个开源的Python发行版本,其包含了conda.Py ...

  2. Netty Decoder:ByteToMessageDecoder

    1. ByteToMessageDecoder 这个类是解码器的基类,其中描述了解码器基本的工作方式和实现原理::还定义了一个解码的抽象方法decode,这个方法由业务实现,负责将一段字节数据解码为具 ...

  3. Robot Framework - Tips

    01 - 使用robot本身的API Robot Framework的版本发展是向下包容,建议尽量使用robot本身的API. 例如:通过导入logger.py(...\Lib\site-packag ...

  4. Java 虚拟机对锁优化所做的努力

    作为一款公用平台,JDK 本身也为并发程序的性能绞尽脑汁,在 JDK 内部也想尽一切办法提供并发时的系统吞吐量.这里,我将向大家简单介绍几种 JDK 内部的 "锁" 优化策略. 1 ...

  5. 使用maven插件构建docker镜像

    为什么要用插件 主要还是自动化的考虑,如果额外使用Dockerfile进行镜像生成,可能会需要自己手动指定jar/war位置,并且打包和生成镜像间不同步,带来很多琐碎的工作. 插件选择 使用比较多的是 ...

  6. 异步请求中jetty处理ServletRequestListener的坑

    标题起得比较诡异,其实并不是坑,而是jetty似乎压根就没做对异步request的ServletRequestListener的特殊处理,如果文中有错误欢迎提出,可能自己有所疏漏了. 之前遇到了一个b ...

  7. C# 请求接口返回中文乱码→???

    在工作过程中,调用第三方接口出现当返回的数据是中文的时候,中文数据便会变成 这样??? 迷~ ,一开始我以为是发送成功后接收字符编码是不是不对,在换过UTF-8,Unicode,...都是不行. 最后 ...

  8. two's complement,2的补码

    本文为作者原创,允许转载,但必须注明原文地址:https://www.cnblogs.com/byronxie/p/10117265.html Let's start with one questio ...

  9. 使用google wire解决依赖注入

    使用google wire解决依赖注入 google wire是golang的一个依赖注入解决的工具,这个工具能够自动生成类的依赖关系. 当我们写代码的时候,都希望,类都是一个个独立的结构,互不耦合, ...

  10. C# 通过java生成的RSA公钥加密和解密

    最近工作需要将对方公司生成的RSA加密公钥进行明文加密和解密,发现了几点贴出来做个笔记. RSA单次加密是有长度限制!微软封装的加密方法如果出现长度超出指定范围的话报错是直接报“该项不适于在指定状态下 ...