题意

直接看题目吧,不好描述

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. Mybatis框架六:关联查询

    这里搞一个测试场景: 用户和订单,一位用户可以有多个订单,而每个订单只属于一位用户 以用户为中心,相对于订单:一对多 以订单为中心,当对于用户:一对一 两张表结构: 订单表: 用户表: 对应的POJO ...

  2. SWIG 基本概念和入门

    C 和 C++ 被公认为(理当如此)创建高性能代码的首选平台.对开发人员的一个常见要求是向脚本语言接口公开 C/C++ 代码,这正是 Simplified Wrapper and Interface ...

  3. Python中的算数运算

    算数运算符 计算机,顾名思义就是负责进行 数学计算 并且 存储计算结果 的电子设备 目标 算术运算符的基本使用 01. 算数运算符 算数运算符是 运算符的一种 是完成基本的算术运算使用的符号,用来处理 ...

  4. asp.net core mvc发布后显示异常错误信息的方法

    在发布的项目文件夹中找到web.config文件,修改: <aspNetCore processPath="dotnet" arguments=".\Cloud.B ...

  5. SQL中EXPLAIN命令详解

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...

  6. (转)Python__slots__详解

    原文:https://www.cnblogs.com/rainfd/p/slots.html#top 摘要 当一个类需要创建大量实例时,可以通过__slots__声明实例所需要的属性, 例如,clas ...

  7. vue 移动端屏幕适配 使用rem

    要想移动端适配 并使用 rem  您需要先看这篇文章,配置好less ➡️ 在vue 中使用 less,就可以使用rem了 如果项目已经开发的差不多了,没有用到rem 又要使用rem,您用这招. po ...

  8. ElasticSearch入门1: mac 安装

    入门学习顺序: 1. 安装: 1.1 单实例安装: Elastic官方网站: http://www.elastic.co 下载 ElasticSearch: 第一步:点击下载 第二步:点击downlo ...

  9. 【原创】Git删除暂存区或版本库中的文件

    0 基础     我们知道Git有三大区(工作区.暂存区.版本库)以及几个状态(untracked.unstaged.uncommited),下面只是简述下Git的大概工作流程,详细的可以参见本博客的 ...

  10. python 要掌握面向对象,你得会做这些题

    1,面向对象三大特性,各有什么用处,说说你的理解. 继承:解决代码重用问题 多态:多态性,可以在不考虑对象类型的情况下而直接使用对象 封装:明确的区分内外,控制外部对隐藏属性的操作行为,隔离复杂度 2 ...