多校联合赛总结
第一场(HNU)
第一题 :状态压缩dp,这是赛后才学习的。我们把字符串看作节点,然后以重叠部分最大长度建边,求一条最长的哈密尔顿路便能得到总的最小长度。这个题比较有意思的是让构造出最小的解。
Dp[v][G] 表示从V出发走到G并走完G能得到的最长路。然后再记录下推倒过程
Path[v][G][0] 表示 从v出发,当dp[v][G]取得最小值时,与v连接的G中的点的个数
Path[v][G][k]表示
然后直接搜索构造,搜索时有优化,那就是我们尽量选取字典序小的01串放到前面,而且本体内没有01串相同的串。也没子串。
第二题 :匈牙利算法, 这个题比赛时和队友讨论了很久才得到结果,wa了2次,因为思路错误,导致错误代码写了2次,这都是经验啊! 如果不是很拿得准的时候,最好确定一下再写。建图方式 : 将人拆成点分为左右两边,我们将有矛盾的两个人之间连边,且因为同时讨厌猫和同时讨厌狗都会引起冲突,也就是说冲突应该有两种,一种是猫的冲突,一种是狗的冲突,但是由于二分图建立的图是无相的,因此,如果我们单单是因为有冲突就将两个点相连,很明显是不对的,而且左边有a1, b1(两个人)右边还有a2, b2(这是由于将人拆点导致的)有了矛盾我们是连a1b2还是a2b1呢? 很明显这里冲在问题。因此我们将猫和狗的冲突分开,由于猫导致的,我们从左向右引边,如果是狗导致的矛盾,我们就从右向左引边,这样矛盾就不会冲突了。而且同一个矛盾只会出现一次。
第三题 :这也是思想很好的题,赛后才学会的, 一共有四中操作
我们让三个数字有序a,b,c,
L = b –a,
1:中间向左跳
2:中间向右跳
3:左往中间跳(L < R)
4:右往中间跳
也就是说同一时刻我们只有三种操作。但是利用这三种操作搜索,也是会死人的,状态数太多(深度可能达到10^9)。于是乎我们观察这三个操作,他们是可逆的,假设b跳过a左边,产生了(a – L, a, c), 那么a-L跳到中间必然能产生(a, b, c);这就让我们想到可不可以建一个图来表示这些操作,这样的话我们就可以在表示出这四个操作能得到所有状态的同时,使得操作有序话,而且由于往中间跳的操作同时之能有一种,所以我们可以的出一个结论,也就是说这个图有一个根,也就是说它是一棵树。父节点表示往中间跳,左右孩子分别表示往左右跳。(多么巧妙啊!)然后这个题就可以做了,让我们判断能否从给定的状态s走到给定的转台T,那么我们只需要看s和T是否同根即可,右让我们求最少的操作S变为T,那么也就是让我们求这个数中,S和T的最近公共祖先,最近公共祖先可以通过将两个点调整到同一高度,然后二分一个距离,看两个点能否走到同一个点,能的话减小距离,不能就增加距离。
由于左面往中跳K次导致L不变,R = R - K
×L。利用这个我们能够快速求出到根的距离。
返回步长应该是mid
× 2 + step
二分应该是l <= r
第四题:动态规划(后来做的)其实这个题后来想想还是不是很难的。原始的问题会比这个题少一个操作那就是花费1的费用将某个字符后边的全变成某个字符。之前我们利用状态
Dp[i][j]第一个串的后i个和第2个串的后j个完全匹配后需要的最小步数。那么现在增加的操作是Suffix change(k)将p之后的所有字符变为某个k。那我,在我们dp[i]的时候,我们关心的问题就是在i之前是否进行过Suffix change(k)操作,如果有,那么我们的dp[i]就再也不是之前的情况了。因此增加一维dp[i][j][k]表示在i之前最后进行了suffix K操作并且后i和后j完全匹配最小话费。这样就可以从后往前dp了
转移方程:(用52表示没进行suffix操作)
Dp[i][j][k] =
MIN{
K = 52 时(即前面没用过操作suffix)
dp[i + 1][j][k] 删掉一个字符i
}
第五题:一个图内三点间最近距离,当时队友做的,后来自己做的时候,居然也忘掉了枚举一个点i求map[i][0] + map[i][1] + map[i][2]的最小值。这个题三次dijstra或spfa能过,Floyd优化下也能过。
第六题:这个题利用hash,右列了一个方程,准确的确定了一下在n的范围内能与x形成等差的数(比x小的)K有哪几个,然后hash表一步一步的填充,如果在进行到x的时候
存在一个k和2x-k没有同时在hash中出现,说明这个x满足。 正解没看懂。。。
第七题 :计算几何题,(后来做的)。细心的分析一下,其实也不是一道难题,之前被计算几何吓倒了。 每次旋转的转动量和长度都是一样的,而在圆上的点可以当作是从圆心到那个点的一个向量,同样可以利用向量旋转来的到点旋转n此后的坐标。
第八题 :水题, 枚举即可。
第九题 :也是水题吧,强联通分量的题,不过作为全场第一个过的,还是小高兴一下。