模拟53—「ZYB和售货机·ZYB玩字符串·午餐·计数」
ZYB和售货机
考试的时候,只让最大的连边了,次大更新的时候在联通块之间有影响,所以就梅了。
upd 被boxin Diss了,貌似只连最大没事,考场并查集判环没打对。
正解应该是让所有的连边,并且我们可以知道让最大的选到剩一个一定最优。
然后先划分出来联通块,再在每个联通块内找环。
这个由于人比较傻,不会高明的实现,所以就双向边找联通块,单向边找环了。
然后如果无环,说明有拓扑序,可以统计答案。
否则找一个代价最小的去掉,这个代价可以是一条边权或者是次小减最小
ZYB玩字符串
考场上打了一个假的暴力,但是那个暴力虽然不对,也使我想起来了有一个东西我并没有掌握。
就是这个 ,甚至这让我想起来我连kmp都快不会了,这个栈用的挺nb。
暴力判断是不对的,因为从每次删第一个并不能保证删完所有情况(没大样例混然不知.jpg)
所以就衍生出来一种正确的暴力,在每个位置尝试枚举当前有的所有串删掉进行判断。
如果有了这个暴力,就不难想到用 \(dp\) 优化复杂度。
定义 \(dp_{l,r}\) 代表在我们枚举的串下 \([l,r]\) 是否合法。
因为我们这个 \(dp\) 的目的是达到每次枚举所有可删的删掉,所以对于 \((r-l+1) \% len\) 不等于 \(0\) 的区间也要有意义,具体意义就是匹配枚举串的前缀。
为什么只匹配前缀就可以保证判断了所有情况?
考虑除了整块,剩下的一定是被支离破碎的字符们。
如果我们保证匹配对应位置的字符,那么原串就是合法的。
转移的话如果能把 \(dp\) 代替暴力的原理想清楚还是可以自己写的。
分加入字符和加入一个整块分开考虑即可。
午餐
还没码,先咕
upd 9.15 码完了。
是个nb题,学了一下午。
题目让我们构造出来每条边的方案,并且给了一些限制。
现在的关键是如何满足这些限制,如果是树的话可以考虑 \(dp\) 求解。
如果是图,由于没有固定的转移顺序,一个朴素的思路就是用最短路来代替树形 \(dp\) , \(spfa\) 每次更新之后都重新拉回队列 。
这个可能是对于树形 \(dp\) 图化版的一般思路。
先满足 \(-1\) 的限制,需要求出来一个数组 \(lim_i\) 表示 \(i\) 点为了保证所有 \(-1\) 合法,在 \(lim_i(inclusive)\) 前无法学会
为了有更多的选择空间,需要在保证合法的情况下让 \(lim\) 尽量小。
既然尽量小,那么其实是有单调性的,可以 \(dij\) 。
这个初始化所有 \(-1\) 点是 \(Inf\) , 考虑 \(x\)更新 \(y\) 的情况。
如果 \(lim_x \geq r_{ed}\) ,因为需要尽量小,所以假设边权是 \(l_{ed}\) ,那么就用 \(l_{ed}\) 更新 \(y\)(先吃完在让 \(y\) 学会)
反之则说明可以通过调整边权不让 \(y\) 影响 \(x\) ,就不更新。
接下来就是构造答案的时候了,为了构造答案需要求出来一个 \(f_i\) 代表 \(i\) 最早在什么时候可以学会。
考虑 \(x\) 更新 \(y\) 的情况,假设 \(t=max(f_x,lim_y+1,l_{ed})\) ,他的实际意义是这条边生效的最早时间。
如果 \(t \leq r_{ed}\) , 那么尝试让 \(x\) 更新 \(y\) 。
更新如果成功,那么就考虑让更新后的答案作为更新这条边的答案,因为他肯定是合法答案之一,但是如果原来的答案更小,就说明 \(y\) 更新 \(x\) 的时间更早,所以需要取 \(min\) 。
如果更新失败,这种情况发生当且进当 \(f_y\leq mx\) , 并且可以知道 \(mx==f[x]\) ,那么为了让 \(x\) 合法,就让边权是 \(mx\) , 这里可以直接赋值因为可以保证 \(y\) 更新 \(x\) 的限制只会更小 。
如果不合法,也就是 \(t \geq r_{ed}\) 这种情况下讨论是谁让 \(t\) 大,即可得到让 \(l\) 做答案是合法的。
注意有没访问到的边直接随便选择一个就好了。
计数
首先如果没有限制,答案很显然。
设计状态 \(dp_{i,j}\) 代表 \(i\) 子树中 \(size\) 是 \(j\) 的方案数。
有转移
现在考虑有限制的情况。
\(dfn_a<dfn_b\) 的情况只有a是b的祖先或者a在左子树,b在右子树。
然后分 \(zx_a<zx_b\) 和 \(zx_a>zx_b\) 两种情况,可以得出对左子树大小的限制,从而限制 \(k\) 的枚举范围。
这步nb的地方在于把限制转化成对左子树的限制,还是要思考才能想到,对于我这种连二叉树都没看到的....
然后正常枚举转移就好了。
总结
这场考试前状态非常不好,又困又头晕(差点倒在路上)
但是发现 \(flag\) 还是很容易倒,尤其对于这种 \(T1\) 的sb暴力又不想打分又少,当时脑子比较傻逼不知道记忆化要开几维数组所以没打。
这种题打不想拿分而是帮助调题的暴力也是很有必要的。
但是没暴力拍做法假了都不知道,感觉T1花点时间还是能A的。
T2也假了,太过自信了,甚至都没有怀疑过做法的正确性,这个必须要改改。
T3,T4根本没看进去,T4才是最有思考性的题,并且感觉不是很遥不可及。
对于这种场就应该快速拿到该拿的分然后一头栽进dp中。

浙公网安备 33010602011771号