UOJ Logo xjr的博客

博客

NOIP Simulation Round #2 题解

2017-11-06 22:06:20 By xjr

题面中充满了对大家的期望 ^_^

展览会(exhibition)

from xjr,题解 by xjr

算法一

妈妈我会写循环!

第一重枚举第一个传送门放哪,第二重枚举第二个传送门放哪,然后再套个循环计算所有人需要花多少时间就好啦。

时间复杂度:$O(n^3)$

期望得分:30分。

算法二

我们发现实际上每个计划的方向并不重要,因为对于计划 $(a,b)$ 我们可以想象成两个点从 $a$ 和 $b$ 分别出发,走到最近的传送门(这一点如果你写了上面的暴力就可以理解了)。

所以我们可以把所有 $a$ 和 $b$ 揉到一起排序,然后靠左的部分一定要走到左边的传送门,靠右的部分一定要走到右边的传送门。

我们枚举左右部分的分界线。令左边的所有坐标分别为 $A_1,A_2,\cdots,A_p$,右边的所有坐标分别是 $B_1,B_2,\cdots,B_q$,令左边的传送门坐标为 $L$,右边传送门坐标为 $R$,那么我们需要最小化 $\sum_{i=1}^p {|Ai−L|} + \sum_{i=1}^q {|Bi−R|}$,不难发现前半部分 $L$ 和后半部分 $R$ 取一个中位数,然后暴力算答案就好了。

$a=b$ 的部分就是启发你想中位数的

时间复杂度:$O(n \log n+n^2)$

期望得分:60分

算法三

我们发现预处理一下前缀和,可以在枚举分界线之后 $O(1)$ 计算答案!

时间复杂度:$O(n \log n)$

期望得分:100分

带环最短路(cyclepath)

from xjr,题解 by xjr

算法一

妈妈我会写爆搜!

从 $1$ 号节点出发 dfs,记录一下路径,如果有一个点被重复经过了,说明走了一个环,最后到达 $n$ 并且已经走了一个环就更新答案。

时间复杂度:$O(不一定跑得过)$

期望得分:0~20分(我并没有写爆搜所以不知道有多少分

算法二

诶我的爆搜为啥得了 30 分?

因为 $n=m$ 时只有唯一的路径(或不存在解)。

时间复杂度:同算法一

期望得分:30分

算法三

每个点都有一个长度为 $1$ 的自环!这是全世界最小的环了。

算出 $1$ 到 $n$ 的最短路,然后加 $1$ 就好了。

时间复杂度:$O((n+m) \log n)$

期望得分:结合算法一或二,40分

算法四

我们可以找一条边 $a \rightarrow b$,然后 $b$ 到 $a$ 的最短路加这条边的边权就是一个环的大小了。再把环的大小加上 $1$ 到 $a$ 的距离和 $a$ 到 $n$ 的距离就是一个合法方案的答案了。

于是 floyed 处理出每两个点间的最短路。

时间复杂度:$O(n^3)$

期望得分:结合算法三,70分

算法五

一条带环路径一定要经过某个点至少两次,所以我们可以关注一下一条路径上经过的某个点。

设 $f(i,j)$ 表示从 $1$ 到 $i$ 的路径中经过了 $j$ 一次的最短路(如果已经经过某个点两次,则 $j=0$)。然后分情况转移,跑最短路就好啦。细节留给你们思考。

时间复杂度:$O((n^2+nm) \log n)$

期望得分:100分

摆直线(setline)

from xjr,题解 by xjr

非常抱歉这题大样例出锅了。。。$k$ 和 $Y_i$ 变成了 $10^9$ 范围。。。

不过就当给大家做一个 long long 检测吧。。。

算法一

对于每个询问,直线需要经过第 $a$ 个点(以下简称点 $a$),而且直线斜率已经固定了,那么直线的解析式就可以算出来了。

然后通过解析式算出横坐标在 $[l,r]$ 之间的点的目标位置,和它本身的纵坐标的差取个绝对值然后求和就好了。

时间复杂度:$O(nq)$

期望得分:20分

算法二

如果所有总坐标都相同,那么就是一排高度相同的点移到直线上,相当于两个等差数列求和。

时间复杂度:$O(n+q)$

期望得分:结合算法一,30分

算法三

如果每组询问都有 $a=1$,那么就是直线一直固定,每个点移动到这个直线的代价也是固定的。

那么处理一下前缀和,每次询问也能 $O(1)$ 回答了。

时间复杂度:$O(n+q)$

期望得分:结合算法一&二,40分

算法四

$k=0$,即直线水平,每个点到直线的距离就是总坐标的差的绝对值,绝对值要分正负讨论。

我们可以将询问离线,按询问中的点 $a$ 纵坐标升序排序,同时将所有点按纵坐标排序。那么随着点 $a$ 的总坐标的增加,每个点的纵坐标和点 $a$ 纵坐标的大小关系只会变化一次,也就是正负性只会变化一次。所以我们可以维护两个树状数组分别维护点的纵坐标的前缀和与点的纵坐标相反数的前缀和,当某点正负性变化后,把它从一个树状数组中删除再加到另一个树状数组中就好了。

时间复杂度:$O((n+q) \log n)$

期望得分:80分

算法五

$k \ne 0$,也一样,只不过把询问按照过点 $a$ 的直线的纵截距排序,同时每个点按照过这个点的斜率为 $k$ 的直线的纵截距排序就好了。

时间复杂度:$O((n+q) \log n)$

期望得分:100分

最后,感谢验题人 wzj52501

评论

oscar
t2是不是可以拿一些最短路算法跑最小环,然后拆点再跑一遍啊
ssdfzhyf
XJG的题解写得很清楚,+1s

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。