CF1557D
用时:1h
发现路径长度都是 \(2^i\),可以类似 floyd 那样处理出以 \(0/1\) 开头 \(x,y\) 是否有长度为 \(2^i\) 的路径。
统计答案可以用一个数组记录能到哪些点,从大到小贪心,不断扩展。
注意 floyd 要用 bitset 压一下,不然会 TLE。
总结:注意如果 long long 类型的位运算千万不要写 1 << i,写 1LL << i,不然会溢出。
QOJ 9879
用时:1h
很不好转移但他按照顺序走,故可以设计 \(f_{l,r}\) 表示走完 \([l,r]\) 的最小代价,出发点就是 \([l,r]\) 中最小横坐标和最小纵坐标,为了方便处理可以把 \((0,0)\) 当成第 \(0\) 个点。
总结:对于这类这种每一段的策略相同的可以考虑类似区间 DP 的状态设计。
CF771D
用时:1h
我们可以知道同种字符顺序不变,然后交换相邻位置是经典套路,知道最后的答案后操作次数就是不同字符位置的逆序对数。
考虑用 DP 确定最后的答案,设 \(f_{i,j,k,0/1/2}\) 表示用了 \(i\) 个 V,\(j\) 个 K,\(k\) 个其他字符,\(0/1/2\) 为结尾是 V,K,其他,因为要保证最后答案不能有子串 VK,暴力转移即可。
总结:交换相邻位置排序是经典套路,不要忘记了。
CF331C3
用时:1h
发现 \(f\) 都单调性,故 C1 就直接模拟就行。
设 \(f_{i,n}\) 表示前面最大位为 \(i\),将 \(n\) 变为 \(0\) 的最小操作次数,\(g_{i,n}\) 表示为操作后的 \(n\)。
转移时找出最大的 \(k,10^k<=n\),分 \(n\mod 10^k\) 和 \(n - n\mod 10^k\) 转移即可。
分析复杂度,考虑 \(n\) 操作后会变成原来的后缀或者,一堆九加最后一位,所以 \(n\) 的总数是 \(|n|\log n\) 的。
总结:如果想到一些复杂度比较难计算的,可能在限制条件下,复杂度是正确的。
CF1601D
用时:30min
超级贪心,以 \(max(a_i,s_i)\) 为第一关键字,\(s_i\) 为第二关键字排序,然后模拟即可。
总结:多分析性质,寻找规律。