博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【文文殿下】 Teleporters 传送器 题解
阅读量:5264 次
发布时间:2019-06-14

本文共 1262 字,大约阅读时间需要 4 分钟。

一个结论:“从出发点开始走绝对不会出现死循环”。

考虑如何证明这个结论(这会直接提示正解):
我们对数轴分段,对于任意一个传送门,把当前段分成两段。
对于每一段(除了第一段)我们总会有一个到达这个段的方法:走一个传送门。这个传送门的位置是这个段左边第一个传送门,我们查看这个传送门通向哪里,然后把那个点与这个点连一条有向边。
对于每一段(除了最后一段)我们总会有一个离开这个段的方法,和上面类似建图。
我们考虑,我们在行走过程中,由于第一个段没有入度,所以我们绝对不会回到第一个段。
由于最后一个段没有出度,所以我们绝对不会向其他地方循环。
由于除了开头和结尾的特殊段,其他任何段有且仅有一个入度和出度,所以我们一定会从一号段到达最后一个段离开。
证毕。
我们发现,除了从一号点到最后一个点是一条简单路径,其他的点一定在一个环里(可以画图理解)。
考虑我们新加一个传送门,会导致这张有向图如何变化?
我们有三种加的方式:

  • 一:用一对传送门把两个不在同一个连通块的点链接。
    这会直接导致有两个点一分为二,然后他们所在的连通块合并。
    如果我们合并路径和环,我们会得到一个更长的路径。
    如果我们合并环和环,我们会得到一个更大的环。
  • 二:用一对传送门链接同一个连通块里两个点。
    这会直接导致这个连通块一分为二。这对答案没有任何帮助。
  • 三:这对传送门放在某对传送门的内部,这会导致我们永远无法访问到这个传送门,所以他单独成一个点。

题解显而易见,我们把所有环从大到小排序。

然后从大到小,用传送门把他们用方法一连到我们的路径里。
如果连完以后,传送门还有剩余,我们可以不断做方法三和方法一,把他们累加到答案里。
细节:如果只剩一个传送门,我们就把他加在末尾。
时间复杂度\(O(nlogn)\)
进一步优化:
我们发现复杂度瓶颈在于排序,但是由于排序的值非常小,我们使用桶排序。
时间复杂度到达理论下届:\(O(n)\)
但是我懒得写线性的,下面给出\(O(nlogn)\)的代码,吸氧能过。

#include
using namespace std;const int maxn = 2e6+10;struct qwq { int inc,out;}s[maxn];struct QQQ { int l,r;}L[maxn];struct QAQ { int v,bl,type; const bool operator < (const QAQ& rhs) const { return v
()); for(int i=1;i<=tot&&m;++i) { ans+=2; --m; ans+=sz[i]; } if(m) { if(m&1) --m,++ans; ans+= 2*m; } printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/Syameimaru/p/11116087.html

你可能感兴趣的文章
A - 娜娜梦游仙境系列——诡异的钢琴
查看>>
django中的静态文件管理
查看>>
kinect笔记 四、kinect中的一些脚本和参数的作用(持续更新)
查看>>
laravel 创建自定义全局函数
查看>>
javascript剔除数组重复元素的简单方法
查看>>
JavaScript常用技巧之时间操作
查看>>
w !sudo tee %
查看>>
在我即将离职之际,一点叨叨。
查看>>
Oracle HRMS API's
查看>>
自已写的Json序列化方法,可以序列话对象的只读属性
查看>>
iOS 时间操作
查看>>
centos/7下安装mysql5.7
查看>>
加成序列(迭代加深)
查看>>
mysql-MySql Update与case when
查看>>
用python实现一个回文数
查看>>
变量和参数传递
查看>>
Wndows下Apache+php+Mysql环境的搭建及其涉及的知识(转)
查看>>
ubuntu配置阿里云源
查看>>
任务系统
查看>>
【转】C#笔记之委托(Delegate)(一)
查看>>