题意

直接看题目吧,不好描述

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. Go语言数组

    目录 声明数组 数组在内存的结构 初始化数组 使用数组 函数间传递数组 数组使用注意事项 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列(这是一种同构的数据结构);这种类型可以是任意的原始类 ...

  2. prompt的工作原理

    浏览器提供了一个内置函数,可以用来获取用户输入:这个函数就是prompt.函数prompt与你使用过的函数alert很像(它也显示一个对话框,其中包含你指定的字符串),但它还提供了让用户输入响应的区域 ...

  3. HTTP 协议常见首部字段

    首部字段 1.HTTP协议的请求和响应报文中必定包含HTTP首部.首部内容为客户端和服务器处理请求和响应提供了所必须的信息. 2.HTTP首部字段是由首部字段名和字段值构成,中间用冒号“:”隔开.字段 ...

  4. 第86节:Java中的JQuery基础

    第86节:Java中的JQuery 前言复习 定时器: setInterval clearInterval setTimeout clearTimeout 显示: img.style.display ...

  5. Solr搜索引擎入门知识汇总

    1.技术选型,为什么用solr而不用lucene,或者其他检索工具 lucene:需要开发者自己维护索引文件,在多机环境中备份同步索引文件很是麻烦 Lucene本质上是搜索库,不是独立的应用程序.而S ...

  6. spark面试总结4

    Spark on Yarn面试篇04 1.MRV1有哪些不足? 1)可扩展性(对于变化的应付能力) a) JobTracker内存中保存用户作业的信息 b) JobTracker使用的是粗粒度的锁 2 ...

  7. hbase之createTable完整的netty实现执行流程

    hbase的客户端代码并不想hive一样用java编写,shell调用,而是使用ruby编写. 在admin.rb文件中方法create,其中接受两个参数,其中第二个参数类型为变长参数. 而在crea ...

  8. yarn组件通信协议简介

    ResourceManager与NodeManager通过ResourceTracker协议通信. NodeManager通过NodeStatusUpdaterImpl中的ResourceTracke ...

  9. requests 处理异常错误 requests.exceptions.ConnectionError HTTPSConnectionPool [Errno 10060]

    使用python requests模块调用vmallarg.vmall.com接口API时报如下错误: requests.exceptions.ConnectionError: HTTPSConnec ...

  10. 自动测试工具(Jmeter,qtp等)

     loadrunner.Selenium.QTP三者区别?    Loadrunner是商业性能测试工具,收费,功能强大,适合做复杂场景的性能测试.  Selenium是开源的web自动测试工具,免费 ...