BZOJ 5415: [Noi2018]归程(kruskal重构树)
##解题思路
$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重构树)的更多相关文章
- [NOI2018]归程 kruskal重构树
[NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)
LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- 洛谷P4768 [NOI2018]归程(Kruskal重构树)
题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...
- BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增+最短路
BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好久不 ...
- NOI Day1T1归程(Kruskal重构树+Dijkstra)
NOI Day1T1归程(Kruskal重构树+Dijkstra) 题目 洛谷题目传送门 题解 其实我不想写......,所以...... 挖个坑......我以后一定会补的 luogu的题解讲的还是 ...
- #2718. 「NOI2018」归程 kruskal重构树
链接 https://loj.ac/problem/2718 思路 我们希望x所在的连通块尽量的大,而且尽量走高处 离线的话可以询问排序,kruskal过程中更新答案 在线就要用kruskal重构树 ...
- loj2718 「NOI2018」归程[Kruskal重构树+最短路]
关于Kruskal重构树可以翻阅本人的最小生成树笔记. 这题明显裸的Kruskal重构树. 然后这题限制$\le p$的边不能走,实际上就是要满足走最小边权最大的瓶颈路,于是跑最大生成树,构建Krus ...
随机推荐
- CSS中的一些伪类
一.:nth-child 和 :nth-of-type (1):nth-child() :nth-child(n) 选择器选取某任意一父元素的第 n 个子元素( p:nth-child(n) 即选中任 ...
- python外星人入侵(游戏开发)
实现的项目要求: 1.外星人游戏添加飞船上下移动功能: 2.为游戏添加背景音乐: 3.在玩家得分.最高得分.玩家等级前添加"Score"."High Score" ...
- 洛谷 P1119 灾后重建——dijstra
先上一波题目 https://www.luogu.org/problem/P1119 这道题我们可以将询问按时间排序 然后随着询问将相应已经重建成功的点进行操作 每次更新一个点就以他为起点跑一遍dij ...
- ssh 免密码登录实现批量处理
搭建集群的时候ssh 免密码登录是一个问题以下脚本将实现批量处理 文件1主机名:host 17.19.18.11:12317.19.18.12:123 文件2:ssh_setup.py #!/usr/ ...
- leetcode.双指针.524通过删除字母匹配到字典里最长单词-Java
1. 具体题目 给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到.如果答案不止一个,返回长度最长且字典顺序最小的字符串.如果答案不存在,则返回空 ...
- C++中类的静态成员变量
1,成员变量的回顾: 1,通过对象名能够访问 public 成员变量: 2,每个对象的成员变量都是专属的: 3,成员变量不能在对象之间共享: 1,在做程序设计中,成员变量一般是私有的.至少不是公有的: ...
- k8s 组件介绍-API Server
API Server简介 k8s API Server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心. kub ...
- 搭建 webpack、react 开发环境(三)
配置 react-router-dom 我们开发一个 React 工程肯定不是一两个“页面”就可以满足需求的,所以我们需要一个在多个“页面”中跳转的功能,在使用 React 构建的单页面应用中,要 ...
- Java Console/控制台 打印表格
功能:控制台打印表格,支持字段动态长度,左对齐,右对齐,居中,设置最大列长,设置列间隔符,设置最多打印多少行. 类下载地址:http://download.csdn.net/download/j506 ...
- getopts的错误报告模式