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$$(x\geq 2,y\geq 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$,如果$sum\leq 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_i\in [-2s_{i-1},-2s_{i}]$

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

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

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

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

$dp[i]=\min\limits_{l_i\notin [l_j,r_j] } dp[j]+dis(l_j,l_i)$

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

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

代码

posted @ 2020-11-13 22:10  SevenDawns  阅读(141)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end