集训8做题记录(下)
A:AT_abc342_f [ABC342F] Black Jack
先求 \(y\) 是每个值的概率,这个是dp,区间加上数据结构优化即可。
然后用这个dp决策 \(x\) 在当前见好就收还是继续,这个要区间查询,上数据结构。
本来都写上线段树了,zhr发现这个差分就能做于是优化到了O(n)。
B:AT_abc343_g [ABC343G] Compress Strings
水题。
发现可以状压,然后拼接可以减少贡献。
然后觉得包含的状态很烦人,发现被包含的没用,于是删去。
写KMP,写哈希,一下就写出来了。
C:AT_abc345_e [ABC345E] Colorful Subsequence
好题,有启发性。
一眼会 \(O(nk^2)\) 的dp,然后不会优化,磨蹭了一会还是放弃了看书了。
发现只要不是同一个颜色那么一定从最优决策点过来,也就是你确定了 \(i\) 从 \(j\) 转移,颜色不同直接取max就可以了。
但是颜色可以相同,发现维护cmx,做完了。
维护mx,cmx不是模拟赛出过的trick,忘没了?其实也和当时的状态不好有关。
D:AT_abc347_f [ABC347F] Non-overlapping Squares
出这题的人家里两位该保重了。
大粪讨,首先三个正方形横向,纵向排列这是一种情况。
然后就是剩下的情况,你画一条线一定能分出一个正方形,然后剩下的再分,形成如这样的:
111333
111333
111222
111222
发现这个旋转一下,只有四种本质不同,加上上面的两种,一共六个分讨。
然后情况明白了直接四个象限方向的前缀max维护出来就能做。
E:AT_abc349_f [ABC349F] Subsequence LCM
做得最坎坷的一题。
看一眼:切了!然后去练虚拟机,写完发现WA + TLE,一分析复杂度,假了!
红温!切回devc++,转换一下上bitset,分析复杂度认为 \(3.5e8\) 量级,但是还是T了 \(9\) 组。
然后换高维前缀和,和bitset一样的容斥,这个理论给100ms都差不多,但是,TLE。
我一行一行看,发现分解因数写成 \(O(m)\) 的了,这能对吗,然后改完过了。
我想,是不是bitset那个也能卡过?于是改了之后跑得飞快。
数据这么水?去卡暴力dp,把取模换成减法,给了两秒就跑 \(1.3\) 秒。
于是我一晚上连着切了这个题 \(3\) 次,疯狂鞭尸。
总结一下高维前缀和做法,我认为是最好的。
首先一个数都不整除 \(m\) 直接丢掉。
发现 \(4 | m\) 的话,\(2\) 无用,所以你对 \(m\) 分解因数形如 \(p^k\)。
然后发现最多只有 \(14\) 个考虑状压,可以容斥,就是所有情况 - 缺一个的 + 缺两个的。
钦定缺了哪些,这个是 \(2^k\),然后就要计算不包含这些因数的数的个数,然后上快速幂计算,发现这个把 \(n\) 扫一遍不行,TLE。
发现其实是枚举超集,所以上高维前缀和,总复杂度 \(O(\sqrt m + nk + k2^k + logn2^k)\)。
F:AT_abc352_f [ABC352F] Estimate Order
暴搜,史。
G:AT_abc373_f [ABC373F] Knapsack with Diminishing Values
背包,发现如果重量都一样就好做了,重量都不一样也好做了因为总情况数是 \(nlnn\) 的。
于是按照重量分组,每组内部暴力贪心,可以用堆,但是复杂度瓶颈不在这里所以暴力扫。
现在我们把一组看成了一个物品,然后进行调和级数的背包,做完了。
H:AT_abc377_f [ABC377F] Avoid Queen Attack
cyf的做法神了,把限制看成 \(4\) 种,暴力容斥,首先一个状态本身好求排序unique即可。
然后两个并随便求了,三个的话就是照样枚举两个,判断这个点是否满足另一个限制。
四个同理,做完了。
I:AT_abc379_g [ABC379G] Count Grid 3-coloring
唐。
短边拎起来状压,变成板子。
J:AT_arc183_c [ARC183C] Not Argmax
这个题真不错吧,看到题有限制想图论发现不可能,然后思考了几个极端情况感觉不具有推广的可能。
于是想上笛卡尔树,因为有最值的性质,之后就茅塞顿开了,考虑笛卡尔树上dp。
实际就是区间dp,枚举 \(l,r,p\) 表示左端点,右端点,最大值位置,然后转移乘一个组合数,这个比较典了。
难点在于判断这个点是否合法,对于一个限制,只有 \(l \le L\) 且 \(R \le r\) 才有用,这个很难维护直接枚举 \(O(n^2m)\)。
这样过不去,考虑了类扫描线的转移,发现可以满足区间dp的转移要求,怎么维护这个呢?直接挂链,先挂到 \(r\) 上。
假设访问了这个 \(r\),就释放上面的限制,把 \(X\) 挂在 \(L\) 上,然后每个 \(r\) 清空 \(vis\) 数组,往前扫,遇到 \(X\) 就 \(vis_X := 1\)。
假设 \(vis_p = 0\),那么 \(p\) 就可以为最大值,否则不行,这么判就是对的。
复杂度 \(O(n^3 + nm)\)。

浙公网安备 33010602011771号