https://www.zybuluo.com/ysner/note/1219964

题面

题面太长,难以概述,[戳我][1]

  • \(ex10pts\ tree\)
  • \(50pts\ n\leq1500,Q\leq2000\)
  • \(65pts\ off-line\)
  • \(100pts\ n\leq2*10^5,m\leq4*10^5,Q\leq4*10^5\)

解析

如果考场上不是盲目地码码码,而是开始先认真思考,我可以多得好多分呢

\(50pts\)算法

堆优化\(SPFA\)预处理\(1\)结点到各结点最短路。

然后从出发点出发,只走当时边权为\(0\)的边(海拔高于水位线),取能走到点中离\(1\)点最短距离即为答案。

本质上就是枚举由坐车转步行那个关键点,坐车无距离,步行距离取最短路,因而可以统计答案。

复杂度\(O(Qn)\)。

注意,只要时间允许,一定要在开头(每组数据开始)清空所有相关数组!!!

il void dfs(re int u,re int g)
{
ans[0]=min(ans[0],dis[u]);
for(re int i=h[u];i+1;i=e[i].nxt)
{
re int v=e[i].to;
if(vis[v]||e[i].g<=g) continue;vis[v]=1;
dfs(v,g);
}
}
il void solve2()
{
fp(i,1,qq)
{
re int v=gi(),p=gi();
v=(v+k*las-1)%n+1;p=(p+k*las)%(s+1);
ans[0]=2e9;
fp(j,1,n) vis[j]=0;vis[v]=1;
dfs(v,p);
printf("%d\n",ans[0]);las=ans[0];vis[v]=0;
}
}

\(65pts\)算法

离线意味着可以改变询问顺序。

怎么改变呢?

我们思维上可能更习惯于水位线上升。

水位线上升时,有边权的边数逐渐增多,我们应该加边。然而加边后怎么办?从出发点出发怎么走?总不能忽略那些边权为\(0\)的边吧。这是一条死路。

于是倒过来看。

水位线下降时,边权一一变为\(0\),意味着两个端点可以合并视为一个点,两个端点到\(1\)号点的距离也可以取\(min\)(表现为取距\(1\)近的点为父亲)。该操作用并查集维护。

这样,把询问按水位线从高到低排序,把边按海拔从高到低排序,如果水位线降到海拔以下就把边的两端点并入并查集,即可做到\(O(?Q)\)复杂度。

il int find(re int x){return f[x]==x?x:f[x]=find(f[x]);}
il void Merge(re int x,re int y)
{
re int fx=find(x),fy=find(y);
if(fx==fy) return;
if(dis[fx]>dis[fy]) f[fx]=fy;else f[fy]=fx;
}
il void solve1()
{
fp(i,1,n) f[i]=i;
fp(i,1,qq)
{
re int v=gi(),p=gi();
v=(v-1)%n+1;p=p%(s+1);
q[i]=(que){v,p,i};
}
sort(q+1,q+1+qq);
sort(a+1,a+1+m);
re int now=2e9,ysn=1;
fp(i,1,qq)
{
if(now>q[i].g)
{
now=q[i].g;
while(a[ysn].g>now)
{
Merge(a[ysn].u,a[ysn].v);ysn++;
}
}
ans[q[i].id]=dis[find(q[i].v)];
}
fp(i,1,qq) printf("%d\n",ans[i]);
}

\(ex10pts\)算法

树的意义是树上任意两点路径唯一。

取\(1\)为根节点,我们只要从出发点一直向上走父亲就可以了,遇到一个有边权的就停下来答该点\(dis\)。

但是暴跳复杂度上限\(O(Qn)\)很虚。

于是倍增优化一下,维护父亲和区间内最小值(新技能\(get\))即可。

话说回来,维护区间内最小值就是这样。

\[f[i][j]=min(f[i-1][j],f[i-1][fa[i-1][j]])
\]

在区间\([j,j+2^{i-1}-1]\)和区间\([j+2^{i-1},j+2^i-1]\)中取\(min\),即可得到区间\([j,j+2^i-1]\)的最小值。

我们只倍增跳区间最小值为\(0\)的区间即可。

复杂度\(O(Qlogn)\)。

il void dfss(re int u,re int fa)
{
for(re int i=h[u];i+1;i=e[i].nxt)
{
re int v=e[i].to;
if(v==fa) continue;
dfss(v,u);
ff[0][v]=u;
ff1[0][v]=e[i].g;
}
}
il void solve3()
{
dfss(1,0);
fp(i,1,18) fp(j,1,n) ff[i][j]=ff[i-1][ff[i-1][j]],ff1[i][j]=min(ff1[i-1][j],ff1[i-1][ff[i-1][j]]);
fp(i,1,qq)
{
re int v=gi(),p=gi();
v=(v+k*las-1)%n+1;p=(p+k*las)%(s+1);
fq(i,18,0) if(ff[i][v]&&ff1[i][v]>p) v=ff[i][v];
printf("%d\n",dis[v]);las=dis[v];
}
}

在上述提高组操作后,即可获得\(80pts\)的高分。。。开头都要跑\(SPFA\)

[1]: https://www.luogu.org/problemnew/show/P4768

[NOI2018]归程(80pts)的更多相关文章

  1. [NOI2018]归程 kruskal重构树

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

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

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

  3. NOI2018 D1T1 [NOI2018]归程 解题报告

    P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...

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

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

  5. 题解 NOI2018 归程

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

  6. [NOI2018]归程(kruscal重构树)

    [NOI2018]归程 题面太长辣,戳这里 模拟赛上写了一个spfa (关于spfa,它已经死了),然后一个st表水完暴力跑路.考后说是Kruscal重构树或者可持久化并查集???这都是些什么东西.不 ...

  7. [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)

    [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kru ...

  8. Luogu P4768 [NOI2018]归程(Dijkstra+Kruskal重构树)

    P4768 [NOI2018]归程 题面 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点. \(m\) 条边的无向连通图(节点的编 ...

  9. P4768 [NOI2018]归程(kruskal 重构树)

    洛谷P4768 [NOI2018]归程 LOJ#2718.「NOI2018」归程 用到 kruskal 重构树,所以先说这是个啥 显然,这和 kruskal 算法有关系 (废话 这个重构树是一个有点权 ...

随机推荐

  1. 将vim的UltiSnips的快捷键彻底从tab键中分离

    在我之前的<<vim之补全1>>和<<vim之补全2>>中曾经成功的将vim的supertab和UltiSnips共用一个tab键, 这样做的优点的两种 ...

  2. javascript的严格模式:use strict

    ECMAscript 5添加的运行模式,禁止一些非标准.不安全的操作. <script> "use strict"; console.log("这是严格模式. ...

  3. On branch master nothing to commit, working tree clean ERROR: Repository not found. fatal: Could not read from remote repository.

    将gitbash部署hexo到github:hexo deploy 报以下错误: Administrator@liu MINGW64 /Hexo $ hexo d INFO Deploying: gi ...

  4. [转载]java中Date,SimpleDateFormat

    一.Java中的日期概述: 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java ...

  5. c/c++排坑(2) -- c语言中的符号重载

    所谓的符号重载就是在不同的上下文环境里有不同的意义.甚至有些关键字也被重载而具有好几种意义,这也是C语言的作用域规则对程序员不那么清晰的主要原因. 本章内容摘自<c专家编程>P37. 大家 ...

  6. 如何利用showdoc自动生成API文档

    介绍 showdoc是一个适合IT团队的文档工具,阅读本文前需要对showdoc有基本了解 .基本介绍可看:https://www.showdoc.cc/help 对于写API文档这件事,虽然说文本编 ...

  7. BZOJ 1601 USACO 2008 Oct. 灌水

    [Description] Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水 ...

  8. 1、深度学习模型的基本结构——RNN

    本系列为深度学习课程笔记,课程网址在http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS17.html 深度学习的基本步骤:定义模型-->定义损失函数 ...

  9. Python与常见加密方式

    前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes. 所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错. 将 ...

  10. Excel 2010/2013/2016在鼠标右键新建xls或xlsx文件后,打开报错“无法打开文件”“文件格式或文件扩展名无效”

    近段时间,陆续有两个同事先后出现同样的问题(在Excel多个版本都可能出现),问题描述: 当用鼠标右键在任意文件夹或电脑桌面“新建”→“ Microsoft Excel 工作表”,再用鼠标双击打开这个 ...