##解题思路
  $NOI2018$的$Day1$ \(T1\),当时打网络赛的时候不会做。学了一下$kruskal$重构树后发现问题迎刃而解了。根据$kruskal$的性质,如果要找从$u$出发,所走边权$>lim$的所能到达的点,可以将边从大到小排序,重构树后从$u$往上跳到点权$>lim$深度最浅的点,这个点子树的叶节点为所求点集合。有了这个以后就可以跑一遍从$1$开始的最短路,记$Min(i)$表示重构树上$i$这个节点所有子树到$1$的最小值。然后对于每次询问,把刚才所说的深度最浅的点找出来,它的$Min$即为答案。

##代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue> using namespace std;
const int N=400005;
typedef long long LL; inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
} int n,m,q,K,S,w[N],f[N][22],T,val[N<<1];
int head[N],cnt,to[N<<1],nxt[N<<1],F[N],tot,num;
LL ans,Min[N]; struct Edge{
int u,v,a,l;
friend bool operator<(const Edge A,const Edge B){
return A.a>B.a;
}
}edge[N]; struct Node{
int id; LL w;
friend bool operator<(const Node A,const Node B){
return A.w>B.w;
}
Node(int _id=0,int _w=0) {id=_id; w=_w;}
};
priority_queue<Node> Q; inline void add(int bg,int ed,int w){
to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt;
} int get(int x){
if(x==F[x]) return x;
return F[x]=get(F[x]);
} inline void init(){
tot=num=ans=cnt=0;
for(int i=1;i<=n;i++) F[i]=i;
memset(head,0,sizeof(head));
memset(f,0,sizeof(f));
} inline void dijkstra(){
memset(Min,0x3f,sizeof(Min));
Q.push(Node(1,0));Min[1]=0; Node now;
while(Q.size()){
now=Q.top();Q.pop();
int x=now.id; if(Min[x]!=now.w) continue;
for(int i=head[x];i;i=nxt[i]){
int u=to[i];
if(Min[x]+val[i]<Min[u]){
Min[u]=Min[x]+val[i];
Q.push(Node(u,Min[u]));
}
}
}
} inline void build(){
for(int i=1;i<=m;i++){
edge[i].u=rd(),edge[i].v=rd(),edge[i].l=rd(),edge[i].a=rd();
add(edge[i].u,edge[i].v,edge[i].l); add(edge[i].v,edge[i].u,edge[i].l);
}
dijkstra(); sort(edge+1,edge+1+m); int x,y;
cnt=0; memset(head,0,sizeof(head)); num=n;
for(int i=1;i<=m;i++){
x=get(edge[i].u); y=get(edge[i].v);
if(x==y) continue;
num++; F[num]=F[x]=F[y]=num;
add(num,x,0); add(num,y,0);
w[num]=edge[i].a; tot++;
if(tot==n-1) break;
}
} void dfs(int x,int fa){
f[x][0]=fa;
for(int i=1;i<=19;i++)
f[x][i]=f[f[x][i-1]][i-1];
for(int i=head[x];i;i=nxt[i])
dfs(to[i],x),Min[x]=min(Min[x],Min[to[i]]);
} int query(int x,int lim){
for(int i=19;~i;i--)
if(f[x][i] && w[f[x][i]]>lim) x=f[x][i];
return Min[x];
} inline void work(){
int x=rd(),y=rd();
x=(x+ans*K%n-1+n)%n+1;
y=(y+ans*K%(S+1))%(S+1);
ans=query(x,y);
printf("%lld\n",ans);
} int main(){
T=rd();
while(T--){
n=rd(),m=rd();
init(); build(); dfs(num,0);
q=rd(); K=rd(); S=rd();
while(q--) work();
}
return 0;
}

BZOJ 5415: [Noi2018]归程(kruskal重构树)的更多相关文章

  1. [NOI2018]归程 kruskal重构树

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

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

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

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

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

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

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

  5. 洛谷P4768 [NOI2018]归程(Kruskal重构树)

    题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...

  6. BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增+最短路

    BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好久不 ...

  7. NOI Day1T1归程(Kruskal重构树+Dijkstra)

    NOI Day1T1归程(Kruskal重构树+Dijkstra) 题目 洛谷题目传送门 题解 其实我不想写......,所以...... 挖个坑......我以后一定会补的 luogu的题解讲的还是 ...

  8. #2718. 「NOI2018」归程 kruskal重构树

    链接 https://loj.ac/problem/2718 思路 我们希望x所在的连通块尽量的大,而且尽量走高处 离线的话可以询问排序,kruskal过程中更新答案 在线就要用kruskal重构树 ...

  9. loj2718 「NOI2018」归程[Kruskal重构树+最短路]

    关于Kruskal重构树可以翻阅本人的最小生成树笔记. 这题明显裸的Kruskal重构树. 然后这题限制$\le p$的边不能走,实际上就是要满足走最小边权最大的瓶颈路,于是跑最大生成树,构建Krus ...

随机推荐

  1. 网络体系应用层之DNS系统

    1.概述 域名系统 DNS 是因特网使用的命名系统,用来把便于人们使用的机器名字(即域名)转换为 ip 地址. 用户与因特网上某个主机通信时,必须要知道对方的 ip 地址,然而用户很难记住长达32位二 ...

  2. [CF1161F]Zigzag Game

    通过这道模板题学了一种新的模型,记录一下. 稳定婚姻匹配 至于这道题,显然是一个二分图博弈的模型.考虑选择Bob,我们要找一组匹配使得任何情况下Bob都有匹配边能走.不失一般性假设Alice选择了in ...

  3. 解决“element表单验证输入的数字检测出来是string”的问题

    form表单: 校验规则: 注意:一.数字类型的验证需要在 v-model 处加上 .number 的修饰符,这是 Vue 自身提供的用于将绑定值转化为 number 类型的修饰符.二.校验中是否添加 ...

  4. [CSP-S模拟测试]:v(hash表+期望DP)

    题目背景 $\frac{1}{4}$遇到了一道水题,又完全不会做,于是去请教小$D$.小$D$看了$0.607$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac{1}{ ...

  5. ValueError: invalid literal for int() with base 10问题处理

    问题描述: 在用pthon写脚本得过程中,发生错误,ValueError: invalid literal for int() with base 10,这种错误是值得类型转换错误,int()函数是可 ...

  6. PHP抓取远程图片到本地保存(如何把错误信息用text文件写入)

    最近在工作中需要开发了一个用户素材功能,里面需要将网上的各种图片素材进行本地化存储.于是在网上找了一些相关资料,并根据自身开发需要,整理了一下主要的逻辑代码. /** * PHP将网页上的图片攫取到本 ...

  7. webpack 4.+版本需要注意的地方

    在webpack打包的时候需要npm下载webpack-cli,而且打包JS的命令从以前的webpack .\src\main.js  .\dist\boundle.js 要编程 webpack .\ ...

  8. Asp.Net Core 第01局:项目创建和部署 转载https://www.jianshu.com/p/9c9750e23b3e

    总目录 一.前言 本文通过从项目创建到部署,简单介绍Asp.Net Core. 二.环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 三.开局 第一手:创建项目   ...

  9. MongoDB Windows之ZIP安装

    下载.下载地址同MSI下载地址:https://www.mongodb.com/download-center/community .Package选择Zip. 下载完成后解压到对应文件夹,该文件夹就 ...

  10. vue如何配置路由 、获取路由的参数、部分刷新页面、缓存页面

    vue如何配置路由 .获取路由的参数.部分刷新页面.缓存页面:http://www.mamicode.com/info-detail-1941546.html vue-router传递参数的几种方式: ...