zoukankan      html  css  js  c++  java
  • AGC11总结

    果然还是做不动正常难度的EF

    A,B不想写

    C.Squared Graph

    首先考虑怎样的两个点是联通的,对于点$(a,b)$和$(c,d)$,可以看作有两个人在点$a$和点$b$上,同时沿着原图的边走,每一次行走两个人都要走,如果可以分别走到$c,d$上,那么说明$(a,b)$和$(c,d)$联通

    那么只要存在$a$到$c$路径长度等于$b$到$d$的路径长度,那么这样的两对点就是联通的,由于可以在图上随便走,那么只要考虑$a$到$b$路径是否存在奇数长度和偶数长度,$b$到$d$同理,如果有一种都存在,那么就是联通的

    考虑原图上的一个连通块,如果这个图中没有奇环(可以通过走到奇环上来改变当前的奇偶性),那么不能使联通块中两点都存在奇偶长度的边(如果有奇环就是都存在),那么这个联通块就是一个二分图,同侧的点存在偶数的路径,异侧点存在奇数路径

    考虑到点对的图上会产生多少个联通块,首先是两个出发点都是在一个连通块,如果二分图产生$2$个,否则产生$1$个

    考虑两个出发点不在同一个连通块中,如果都是二分图产生$4$个,都不是二分图产生$1$个,否则产生$2$个

    最后判断一下独立点即可

    代码

    D.Half Reflector

    好,先来三个结论,推死了

    1.对于一次放球的操作,如果第一个装置为$A$,那么只把第一个装置改为$B$;否则对于$x$个$B$,$y$个$A$的形式,即

    $AAA...ABBB...B$变为$x-1$个$A$,后$y$个$B$,最后一个$A$的形式,$AA...AABBBB...BA$,并且球从右边出去

    如果最后一个极长连续段为$BB...B$,那么全部变$A$即可

    证明?手玩就可以了

    2.对于足够多次操作之和,序列一定会由$BABABABA...$组成

    因为球在通过$BA$的时候,如果$BA$处于序列的最后,那么就不会改变$BA$的状态,这样的$BA$是稳定的

    当然如果$n$为奇数,最初一个装置的状态会在$A,B$中来回变化

    并且在操作的过程中,稳定的$BA$一定从后往前依次出现,直到开头

    3.可以发现,在操作过程中,一个$BA$形成之后,前边的序列是由原来的序列(剔除之前已经有的稳定$BA$)向左平移$2$个单位得到

    证明:对于最简单的形式$x$个$B$,$y$个$A$$(xgeq 2,ygeq 2)$,记$(x)A$表示有$x$个连续的$A$

    一次操作后$(x-1)A(y)B(1)A$

    再一次操作后$(1)B(x-2)A(y)B(1)A$

    再一次操作后$(x-2)B(y)A(1)B(1)A$

    那么就是在最后产生了一个稳定的$BA$,并且向左平移一位

    有了上面的三个结论,就可以做了,对于每一个形成的$BA$,可以得到需要操作几次,那么可以确定$k$落在哪一个范围内,在范围内暴力找即可

    对于序列开头是$A$的,次数$+1$,并将开头改为$B$

    对于开头$B$只有$1$个的情况,次数$+2$

    否则次数$+3$

    所以一段区间内最多$4$次操作,暴力更改即可

    代码

    E.Increasing Numbers

    好妙啊,然而无脑贪心也是对的

    一个重要的观察,对于一个Increasing Numbers,最多拆分成$9$个$111...1$相加的形式,那么如果当前这个数$n$可以拆成$k$个Increasing Numbers的话,$n$最多被拆成$9k$个$111...1$相加的形式(我是根本想不到)

    那么考虑二分答案

    $n=sum_{i=1}^{9k}(10^{r_i}-1)$

    $9n+9k=sum_{i=1}^{9k}10^{r_i}$

    那么只要统计$9n+9k$所有数位上数字的和$sum$,如果$sumleq 9k$,那么合法

    然而,每一次找最大的Increasing Numbers减掉也是对的,只要将每一个连续段缩成一个点,然后找到第一个下降的地方,前面所有的数抹掉,这个连续段抹掉第一个数,剩下的数$+1$继续处理,相当于每一次剪掉$xxxxx(x-1)99999...$这样的数,但细节超级多,一开始细节写挂了,以为做法假了

    但是这个做法为什么是对的呢

    考虑上面那个做法,如果直接利用$1111...1$去减$n$的话,就是贪心地最高位能取则就减掉最高位,但是直接做时间复杂度不对,这就是为什么上面那个做法要用二分的原因,考虑将若干的操作合并到一起,那么就得到这个贪心做法

    代码(贪心)

    代码(二分)

    F.Train Service Planning

    首先如果保证向$0$方向的列车不在中途停靠,最小化向$n$的列车在站点的停靠时间,是不会使答案更劣,并且由于每$k$个时间都会发出一辆列车,那么所有的运算可以在模$k$的意义下进行

    设$0$方向的列车永远从$k$的时间出发,那么其实就是从$0$出发,设$s_i$为$a$的前缀和,$p_i$为到$i$号站点,停靠时间的总和,其中$p_0$为出发时间

    如果$b_i=1$,那么两辆列车在运行过程中不能相交,那么对于$0$方向的列车其运行时间为$(-s_i,-s_{i-1})$,$n$方向的列车运行时间为$(p_i+s_{i-1},p_i+s_i)$,那么只要这两个区间不交即可

    解出不等式即$p_iin [-2s_{i-1},-2s_{i}]$

    最初我在想时候,由于没有设好坐标,写出来的条件很复杂,到后面的DP也不好利用数据结构维护,所有当条件出现了一些难以处理的特殊情况时,要换一个角度,改变一下设的条件,看有没有更好的形式

    那么问题就变成了,选择一个初始位置,每一次加一个数使得这个数在对应的区间内,问最少需要加多少个数

    对应到原问题上,每一次如果需要的在站内等候,那么一定是等到下班的列车到达时候就走掉,那么就是这个问题每一次都贪心的走到左端点

    考虑$dp$,设$dp[i]$表示到$i$个限制左端点的最小代价,那么可以从后往前$DP$

    $dp[i]=minlimits_{l_i otin [l_j,r_j] } dp[j]+dis(l_j,l_i)$

    由于观察到每一个区间其实是单调减的,$dp$也是单调减的,那么这个$min$就可以去掉,变成最后一个没有覆盖到$i$的$j$

    那么区间覆盖可以用线段树维护

    代码

  • 相关阅读:
    (剑指Offer)面试题18:树的子结构
    (剑指Offer)面试题17:合并两个排序的链表
    (剑指Offer)面试题16:反转链表
    程序员水平分级 你属于哪一类?
    Hacker
    十分钟让你看懂中国经济形势,10分钟,坚持看完,必有所获~(转载)
    人口问题,怎样的生育率才能保持正常的世代更替?
    理科和文科的区别?
    柴晓霞:做销售要学会画蓝图 (转载)
    工作,为钱还是为理想
  • 原文地址:https://www.cnblogs.com/huangchenyan/p/13971595.html
Copyright © 2011-2022 走看看