AGC16总结

第一次半个下午半个晚上靠自己把大半场做完了(虽然F之前做过看了题解,D讨论了一下)


A.Shrinking

签到题,首先暴力枚举剩下字符串的字母是哪一个,然后可以将每一次从$n$到$n-1$的操作转化为$n+1$的位置上有一个当前枚举的字符,然后操作数就是由单个字母隔离出来的连续段长度的最大值,总体记录最小值即可

代码

B.Colorful Hats

大力分类讨论,首先一种特殊情况需要特判掉,就是所有数都是$n-1$,这样一定合法。设帽子的种类有$m$种,然后考虑由于每一种帽子的数量要么$>1$要么$=1$,如果当前说话的猫戴的帽子种类数量是$>1$的,那么$a_i=m$,如果$=1$,那么$a_i=m-1$,可以发现,$a$最大最小值不能超过$1$

如果$MAX=MIN$,那么所有$m$种帽子的数量$>1$,那么$Yes$的条件为$2m \leq n$

如果$MAX=MIN+1$,统计一下$MIN$的数量$cnt$,如果$>MAX=m$,那么不合法,否则合法条件为$cnt+2(m-cnt) \leq n$

代码

C.+/- Rectangle

构造题,受到样例的启发,我们可以这样构造

对于$(x,y)$,若$x\%h=0$且$y\%w=0$那么$a_{x,y}=-(h*w)$,否则$a_{x,y}=1$

这样可以保证所有$h*w$的子矩阵一定为负,如果总和为正那么可行

但这样会错几个点

考虑如果$h \nmid n$或$w \nmid m$,那么在最后几列最后几行,会有一些全由正数构成的行列,那么由于需要保证总和$>0$,那么要让正数尽量大,设$lim$为可以填最大数,$lim=\frac{10^9}{hw}$

那么,对于$(x,y)$,若$x\%h=0$且$y\%w=0$那么$a_{x,y}=-((h*w-1)*lim+1)$,否则$a_{x,y}=lim$

代码

D.XOR Replace

首先可以发现,对于题中的操作,设$s=Xor_{i=1}^n a_i$,如果第一次选出来的是$a_i$,那么操作完之后,下一次操作的$s=a_i$,那么就可以转化题意为现在有$n+1$一个数,第$n+1$个称作为游离在外的数,那么每一次操作等价于在$n$个数中选出一个数,并将这个数和游离在外的数交换,问是否可以得到b数组

首先可以简单的判断掉无解的情况,然后考虑如何用最小操作次数来完成这一目标

考虑对于每一个$a_i\neq b_i$,连一条$b_i\rightarrow a_i$的边,那么现在问题转化为一开始从$s$出发,至少需要添加多少条边使得图中存在一条欧拉路径,并且这条欧拉路径从s出发

由于图不一定联通,如果联通块中都存在一个欧拉路径,那么我们就可以将这些联通块串成一个链,走出欧拉路径,这一部分的代价是联通块数量$-1$(注意这里需要剔除单个点的情况,但对于出发点单点的情况,需要将出发点单独视为一个连通块)

那么现在考虑对于一个联通的图如何计算。对于一个欧拉路径,如果从终点向起点连一条边,那么图中就存在欧拉回路,而计算形成欧拉回路至少需要多少条边很好计算,即$\frac{\sum abs(out_i-in_i)}{2}$,最终$-1$即可

代码

E.Poor Turkeys

题中的概率都是吓唬人的。。。考虑转化题意,对于一对火鸡$i,j$其最终存活的概率$>0$的充要条件是存在一种吃火鸡的方式,使得最终$i,j$都存活下来

先对于题目中每一个人的选择建一条$x\rightarrow y$的边

考虑枚举$i,j,$对于$i,j$直接相连点,这些边在选择的时候必须选$i,j$相邻的那些,再考虑下去如果要保证在做这条边选择的时候这个点还存活需要怎么样操作,考虑每一边所代表的操作有先后顺序,那么从前往后考虑,根据刚才的解法,需要当前点需要在$x$时刻之前都不能被删,对于所有操作时间$<x$的边,都需要选择对应的那个点,来保证这个点不被删去,那么这样递归下去,直到有一个点需要的时候已经被删去了,就停止递归,判断当前火鸡对不合法,如果在递归$i,j$的过程中都满足条件,那么就是合法的

代码

F.Games on DAG

首先考虑每一个点求出其$sg$函数,只要$sg(1)=sg(2)$那么Alice必败,否则Alice必胜,那么先统计$sg(1)=sg(2)$的数量(因为数量少)可以发现,如果两个点的$sg$函数相同那么这些点之间一定没有边相连,那么就可以把点根据其$sg$函数值进行分层,并且要保证$1$号点和$2$号点要在同一层内,

由于n非常小,那么用状压来记录状态和枚举转移,记$dp[mask]$为当前$mask$点集已经在$sg$分层中的方案数,然后更新时枚举其子集作为最后一层$sg$的点,考虑具体如何转移,由于$sg$值较大的点一定要连向比其小$sg$层中至少一个点,那么枚举的当前子集,一定有其他已经在集合中的点连向它,那么计算出原来已经在集合中的点连向这些枚举的点的边的数量$w$,那么方案数就是$2^w-1$,然后当前枚举$sg$最小的这些点之间是不能连边的,但是可以连向$sg$函数值比它大的点,同样统计出边的数量,方案数为$2^w$

最终答案就是$dp[2^n-1]$

代码

posted @ 2020-11-12 21:08  SevenDawns  阅读(154)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end