洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树
正解:$kruscal$重构树
解题报告:
语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$
所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海拔.有$Q$组询问,每次查询从$x$出发,经过海拔超过$p$的所有路径,能到达的节点中距离1号节点的最短路径长是多少$QwQ$
首先看到这个对海拔的限制就显然考虑$kruscal$重构树呗$QwQ$,然后说是所有海拔超过$p$的路径能到达的点中最短路最小的点$QwQ$?
可以理解成把最短路作为一个点的属性,然后问$kruscal$重构树中一棵子树中的属性$min$是多少$QwQ$?
那不给每个节点记录下子树内的属性$min$然后每次查询就跳下就成$QwQ$?
然后就做完了鸭$QwQ$
$overrrrrr$
然后$attention$,那个$lastans$在每一轮都要清零,,,因为它是说每个第一天$lastans$都等于0$QwQ$
$over$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define mp make_pair
#define int long long
#define P pair<int,int>
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define fy(i) edge_krus[i].wei
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=+,M=+;
int ed_cnt,ed_tr_cnt,head[N],as[N<<],fat[N<<][],nod_cnt,n,m,fa[N<<],lstas,val[N<<];
bool vis[N];
struct ed{int to,nxt,wei;}edge[M<<];
struct ed_tr{int fr,to,wei;}edge_krus[M]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(ed_tr gd,ed_tr gs){return gd.wei>gs.wei;}
int fd(ri x){return fa[x]==x?x:fa[x]=fd(fa[x]);}
il void ad(ri x,ri y,ri z){edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;}
il void dij()
{
priority_queue< P,vector<P>,greater<P> >Q;
memset(vis,,sizeof(vis));memset(as,,sizeof(as));as[]=;Q.push(mp(,));
while(!Q.empty())
{
ri nw=Q.top().second;Q.pop();if(vis[nw])continue;vis[nw]=;
e(i,nw)if(as[t(i)]>as[nw]+w(i))as[t(i)]=as[nw]+w(i),Q.push(mp(as[t(i)],t(i)));
}
}
il int jump(ri x,ri y){my(i,,)if(val[fat[x][i]]>y)x=fat[x][i];return x;} signed main()
{
freopen("return.in","r",stdin);freopen("return.out","w",stdout);
ri T=read();
while(T--)
{
n=read();m=read();rp(i,,n<<)fa[i]=i;nod_cnt=n;ed_cnt=;memset(head,,sizeof(head));lstas=;
rp(i,,m){ri x=read(),y=read(),z=read(),p=read();ad(x,y,z);ad(y,x,z);edge_krus[i]=(ed_tr){x,y,p};}
dij();sort(edge_krus+,edge_krus++m,cmp);
//rp(i,1,n)printf("as[%d]=%d\n",i,as[i]);
rp(i,,m)
{
ri x=fd(edge_krus[i].fr),y=fd(edge_krus[i].to);if(x==y)continue;
//printf("x=%d y=%d z=%d fy=%d\n",edge_krus[i].fr,edge_krus[i].to,edge_krus[i].wei,fy(i));
fa[x]=fa[y]=fat[x][]=fat[y][]=++nod_cnt;as[nod_cnt]=min(as[x],as[y]);val[nod_cnt]=fy(i);
//printf("val[fa[%d]=fa[%d]=%d]=%d nod_cnt=%d\n",x,y,fa[x],val[fa[x]],nod_cnt);
}
rp(i,,)rp(j,,nod_cnt)fat[j][i]=fat[fat[j][i-]][i-];
ri Q=read(),k=read(),s=read();
while(Q--)
{
ri x=(read()+k*lstas-)%n+,y=(read()+k*lstas)%(s+);printf("%lld\n",lstas=as[jump(x,y)]);
}
}
return ;
}
洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树的更多相关文章
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- 洛谷P4768 [NOI2018]归程(Kruskal重构树)
题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...
- NOI2018 D1T1 洛谷P4768 归程 (Kruskal重构树)
实际上是一个最短路问题,但加上了海拔这个条件限制,要在海拔<水位线p中找最短路. 这里使用Kruskal重构树,将其按海拔建成小根堆,我们就可以在树中用倍增找出他不得不下车的点:树中节点有两个权 ...
- 洛谷 P4768 [NOI2018]归程
洛谷 361行代码的由来 数据分治大发好啊- NOI的签到题,可怜我在家打了一下午才搞了80分. 正解应该是kruskal重构树或排序+可持久化并查集. 我就分点来讲暴力80分做法吧(毕竟正解我也没太 ...
- 洛谷P4197 Peaks&&克鲁斯卡尔重构树学习笔记(克鲁斯卡尔重构树+主席树)
传送门 据说离线做法是主席树上树+启发式合并(然而我并不会) 据说bzoj上有强制在线版本只能用克鲁斯卡尔重构树,那就好好讲一下好了 这里先感谢LadyLex大佬的博客->这里 克鲁斯卡尔重构树 ...
- 洛谷P4197 Peaks (Kruskal重构树)
读题,只经过困难值小于等于x的路径,容易想到用Kruskal重构树:又要查询第k高的山峰,我们选择用主席树求解. 先做一棵重构树,跑一遍dfs,重构树中每一个非叶子节点对应一段区间,我们开range[ ...
- Solution -「NOI 2018」「洛谷 P4768」归程
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的无向连通图,边形如 \((u,v,l,a)\).每次询问给出 \(u,p\),回答 ...
- 洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)
传送门 前置技能,克鲁斯卡尔重构树 我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树 那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价) 可以一开始直接 ...
- P4768 [NOI2018]归程(kruskal 重构树)
洛谷P4768 [NOI2018]归程 LOJ#2718.「NOI2018」归程 用到 kruskal 重构树,所以先说这是个啥 显然,这和 kruskal 算法有关系 (废话 这个重构树是一个有点权 ...
随机推荐
- redhat6.5安装oracle11_2R
参照前人一步一步操作: http://leihenzhimu.blog.51cto.com/3217508/1685164 遇到如下错误: This is a prerequisite conditi ...
- oracle函数 nls_charset_name(n1)
[功能]返回字符集名称参应id值 [参数]n1,数值型 [返回]字符型 sql> select nls_charset_name(852) from dual; nls_char ------- ...
- HZOJ 斐波那契(fibonacci)
先说一个规律: 如图将每个月出生的兔子的编号写出来,可以发现一只兔子在哪一列他的父亲就是谁. 每列的首项可以通过菲波那契求得. 然后你就可以像我一样通过这个规律打表每个点的父亲,预处理出倍增数组,倍增 ...
- 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...
- Bitmap的recycle问题
虽然Android有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定.如果只是使用少量的几张图片,回收与否关系不大.可是若有大量bitmap需要垃圾回收处理,那必然垃 ...
- PHP中__FUNCTION__与__METHOD__的区别
你知道php中__FUNCTION__与__METHOD__的区别吗?本文通过一个小例子,为大家介绍下二者的区别,有兴趣的朋友可以参考下. PHP中__FUNCTION__与__METHOD__的 ...
- js获取本周日期
JS获取到本周的日期 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- Android教程 -06 Activity的生命周期
本篇播客我们重点介绍下如下知识点: 程序启动原理 Activity生命周期 Activity销毁与创建 视频建议采用超清模式观看, 欢迎点击订阅我的优酷 程序启动原理 当用户从主界面点击程序图标时,系 ...
- 2019-8-31-PowerShell-通过-WMI-获取系统服务
title author date CreateTime categories PowerShell 通过 WMI 获取系统服务 lindexi 2019-08-31 16:55:58 +0800 2 ...
- There is no getter for property named 'XXX' in 'class java.lang.String'
实验环境:spring boot+mybitis 由于采用的不带映射xml文件的模式,因此 方法1: 把#{xxx}修改为 #{_parameter} 即可 select count(*) from ...