题意

直接看题目吧,不好描述

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 + 10, INF = 2147483646, B = 18;
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = 1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', 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 << 1];
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 = 1; 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[1] = 0; q.push(MP(0, 1));while(!q.empty()) {int p = q.top().second; q.pop();for(int i = head[p]; i != -1; 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][21], f[MAXN][21], ch[MAXN][21], 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 = 0; i <= 2 * N + 1; i++)  fa[i] = i;sort(E + 1, E + num);for(int i = 1; i < num; i++) {int fx = find(E[i].u), fy = find(E[i].v);if(fx == fy) continue;ch[++cnt][0] = fx; ch[cnt][1] = fy;fa[fx] = fa[fy] = f[fx][0] = f[fy][0] = cnt;g[fx][0] = g[fy][0] = E[i].a;}
}
int mi[MAXN];
int dfs(int x) {mi[x] = INF;if(!ch[x][0] || !ch[x][1]) return mi[x] = dis[x];mi[x] = min(mi[x], dfs(ch[x][0]));mi[x] = min(mi[x], dfs(ch[x][1]));return mi[x];
}
void Pre() {for(int j = 1; j <= B; j++) for(int i = 1; i <= 2 * N; i++)f[i][j] = f[f[i][j - 1]][j - 1], g[i][j] = min(g[i][j - 1], g[f[i][j - 1]][j - 1]);    dfs(cnt);
}
int Find(int bg, int val) {//从bg出发网上跳,找到海拔大于val的最小的点 for(int i = B; i >= 0; 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 = 0;while(Q--) {int v = read(), p = read();v = (v + K * lastans - 1) % N + 1;p = (p + K * lastans) % (S + 1);int tot = 0, pos = Find(v, p);   printf("%d\n", lastans = mi[pos]);}
}
inline void init() {memset(g, 0x3f, sizeof(g));memset(val, 0, sizeof(val));memset(head, -1, sizeof(head)); memset(ch, 0, sizeof(ch));memset(f, 0, sizeof(f));num = 1;
}
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 0;
}

洛谷P4768 [NOI2018]归程(Kruskal重构树)相关推荐

  1. 洛谷 - P4768 [NOI2018]归程(Kruskal重构树+树上倍增+最短路)

    题目链接:点击查看 题目大意:去原网址看吧 题目分析:因为是在刷克鲁斯卡尔重构树的题目,所以稍微思考一下就能想出解法了,首先如果水位线固定了,剩下的边组成的最小生成树也是一定的,此时同一个连通块内的点 ...

  2. P4768 [NOI2018] 归程 Kruskal重构树 + 倍增 + 最短路

    传送门 文章目录 题意: 思路: 题意: 给你一个联通无向图,每条边有一个长度lll和海拔aaa,当海拔≤\le≤水位线的时候,说明这个道有积水.在起始点有一辆车,车可以走没有积水的路,下车后可以走有 ...

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

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

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

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

  5. 洛谷P2245 星际导航(kruskal重构树)

    sideman 做好了回到 \text{Gliese}Gliese 星球的硬件准备,但是 \text{sideman}sideman 的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有 ...

  6. NOI 2018 归程 (Kruskal重构树)

    题目大意:太长了,略 Kruskal重构树,很神奇的一个算法吧 如果两个并查集被某种条件合并,那么这个条件作为一个新的节点连接两个并查集 那么在接下来的提问中,如果某个点合法,它的所有子节点也都合法, ...

  7. kruskal重构树练习

    洛谷 P4197 Peaks 题意: 有 nnn 个山峰,每一个山峰高 hih_ihi​ ,有 mmm 条双向带权边将一些山峰连接起来,有 qqq 次询问,每次询问 (v,x,k)(v,x,k)(v, ...

  8. NOI2018 D1T1 洛谷P4768 归程 (Kruskal重构树)

    题目传送门 实际上是一个最短路问题,但加上了海拔这个条件限制,要在海拔<水位线p中找最短路. 这里使用Kruskal重构树,将其按海拔建成小根堆,我们就可以在树中用倍增找出他不得不下车的点:树中 ...

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

    P4768 [NOI2018] 归程 给定一个nnn个点,mmm条边的无向联通图,边的描述为[u,v,l,a][u, v, l, a][u,v,l,a],表示uuu,vvv连有一条长度为lll,海拔为 ...

最新文章

  1. [WPF]winfom中ShowWPF新窗口时TextBox等控件无法输入问题解决方法 .
  2. 某县百姓百事110便民服务管理系统(1)——项目总结
  3. Python-爬取音悦台MV列表以及反爬虫方法
  4. linux生成驱动编译的头文件,嵌入式Linux字符设备驱动——5生成字符设备节点
  5. ORACLE:Health Monitor
  6. bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
  7. github设置仓库可见性 私人仓库设置
  8. Linux0.11内核剖析--内核体系结构
  9. 训练数据的分布对F-measure, recall 和 precision的影响
  10. 准确率(Accuracy) | 查准率(Precision) | 查全率(Recall)
  11. python 批量处理文件
  12. 微软Azure云计算服务主导全球
  13. TL431中文资料特性及应用
  14. 电脑监控软件都有哪些?
  15. APP加固新方向——混淆和瘦身
  16. JavaScript基础要点
  17. 寒冬之下持续吸金,蛰伏30年的国产数据库终迎黄金时代?
  18. c语言编程送小狗回家,【原创】《My Sherlock Ⅱ 》(BY C语言概率论)
  19. 计算机键盘时好时坏,机子的CTRL键时好时坏?
  20. JDBC批量插入sql-踩坑笔记

热门文章

  1. python 调用函数内部参数
  2. 有效感受野--Understanding the Effective Receptive Field in Deep Convolutional Neural Networks
  3. LeetCode 202. Happy Number--Python解法
  4. mini mysql_mini
  5. bios调整服务器性能模式吗,优化BIOS设置提高显示性能
  6. c语言 获取文件名的相对路径,c – 如何获取对应于给予dlopen的相对路径的绝对库文件名?...
  7. 蜗蜗 Linux内核芬妮下,Linux内核的整体架构
  8. java程序设计输入输出实验_20145320《Java程序设计》第五次实验报告
  9. Jvm 系列(十一)Java 语法糖背后的真相
  10. mysql 5.7 安装错误提示总结