IOI2019题解

為{幸葍}努か 提交于 2019-11-28 10:13:18

由于太懒了,好久没更新了。发个题解好了。

shoes

首先不难证明鞋子配对一定是从前往后将同一种的左和右配对。

配好对之后首先我们可以假设左在右的左边,然后讨论可知将左边靠前的排在前面更优。

rect

先考虑只有行限制的情况,那么我们考虑从大到小插入,那么每次极大的空区间就是符合题意的,这样就可以扣出O(n)个区间。

同时我们可以考虑矩形左上角,对于每个左上角考虑每个行区间的延伸长度,每个列区间的延伸长度,合并的时候是一个扫描线。

此外本题也有不带log的做法,留作习题。

split

假设a<=b<=c,那么显然有a<=n/3,b<=n/2。我们的目标就是要找到两个联通块,满足其中一个大小在[a,n-b](或在[b,n-a])。

我们对[a,n-b]和[b,n-a]都运行以下算法,简记为[l,r]。容易证明l+l<=r。

考虑dfs树。如果树上存在一条符合题意的割边,那么直接输出即可。

否则考虑重心,我们必然有去掉重心之后的每棵子树大小<l,否则这棵子树就符合题意(大小在[l,n/2]之间)。由于只有返祖边,我们只需考虑下属各联通块到重心的祖先是否有边。如果没有,那么它肯定和重心只能同属一个联通块(因为它的大小<l)。如果和重心只能同属一个联通块的大小和>r了那么无解,否则我们先把重心和重心的父亲断开形成两个子树,此时重心子树大小>r,然后我们把能连的子树一个一个抛弃重心往上面连,直到和重心连在一起的大小<=r,这时我们一定有它>=l,由于l+l<=r。

line

考虑螺旋状的构造,那么只有卡在角上的情况才会浪费步数。

把角上单独拎出来搞成两条单调折线。

需要注意的是这个构造并不对所有数据都有效(角被删掉之后会产生新角,新角不一定单调),但是可以获得满分。

vision

如果不转坐标系的话可以直接写个二进制加法器,指令数大概九千多。

转坐标系就是把曼哈顿改成切比雪夫((x+y,x-y)),这样就不用算出准确值了。

walk

首先考虑s=0,t=n-1的情况,这种情况我们肯定不会向左走。所以我们一定是每次先竖直移动一段,然后向右走,重复这个过程。

考虑一座横坐标[l,r]的天桥,如果我们自下而上经过了它,那么不如经过整座天桥。所以我们只需要取出每个天桥断点和断点下方第一个在天桥上的点,跑dijkstra即可。

接下来考虑一般情况,我们发现我们可能需要上一些天桥,但是我们注意到比如我们要从起点开始上一个天桥[l,r],如果起点在[l,r]中,我们可能会为了上这个桥往左或往右拐,但是我们只会拐到第一个能上桥的点,否则改成直接上桥不劣,所以我们只需要把桥在左右第一个能上的地方截开。终点同理。

上述东西都可以用扫描线+set来维护。

Reference:

https://blog.csdn.net/qq_39972971/article/details/99547267

https://blog.csdn.net/qq_39972971/article/details/99868638

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!