zoukankan      html  css  js  c++  java
  • IOI2019题解

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

    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

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

    image

    image

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

    image

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

    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

  • 相关阅读:
    POJ 3923 Ugly Windows(——考察思维缜密性的模拟题)
    POJ 3829 Seat taking up is tough(——只是题目很长的模拟)
    练习json读取中文
    关于调接口和腾讯云cos方面。
    JavaScript如何处理解析JSON数据详解
    js获取url参数值的两种方式
    修改Host,配置域名访问
    Atom设置震撼的编辑效果
    atom总结
    用node.js可以开启静态服务 不需要借助apache 或者xampl
  • 原文地址:https://www.cnblogs.com/zzqsblog/p/11404391.html
Copyright © 2011-2022 走看看