A 可以投机取巧一下强制转为 int
之后是否与原来相等。
B 略,C 随便观察一下即可,略。D 可以实现一个 deque
或者倒序考虑问题,略。
E 建出图后发现是一个带有负权边的最短路模型,跑个 SPFA 可以过,略。
ABC237F - |LIS| = 3
给定 N N N 和 M M M,求满足以下条件的正整数序列的个数:
- 长度为 N N N,每个元素 ∈ [ 1 , M ] \in[1, M] ∈[1,M]。
- 其 LIS 的长度恰好为 3 3 3。
3 ≤ N ≤ 1000 3\le N\le 1000 3≤N≤1000, 3 ≤ M ≤ 10 3\le M\le 10 3≤M≤10。
考虑经典的 O ( n log n ) O(n\log n) O(nlogn) 的 LIS 的做法,发现 f i f_i fi 为“长度为 i i i 的 LIS 的最小结尾数字”,而 DP 数组的长度即为 LIS 的长度,所以干脆考虑令 f i , a , b , c f_{i, a, b, c} fi,a,b,c 表示当前考虑到 [ 1 , i ] [1, i] [1,i],LIS 的 DP 数组为 a , b , c a, b, c a,b,c 的序列个数。不难发现这个状态是没有后效性的,转移就考虑当前填什么数,然后仿照 O ( n log n ) O(n\log n) O(nlogn) LIS 的转移方式进行转移。时间复杂度 O ( N M 4 ) O(NM^4) O(NM4),可以通过。
modint f[1005][15][15][15];
int n, m;
int main() {
read(n, m);
f[0][m + 1][m + 1][m + 1] = 1;
FOR(i, 1, n) FOR(j, 1, m + 1) FOR(k, j, m + 1) FOR(l, k, m + 1) FOR(t, 1, m) {
if (t <= j) f[i][t][k][l] += f[i - 1][j][k][l];
else if (t <= k) f[i][j][t][l] += f[i - 1][j][k][l];
else if (t <= l) f[i][j][k][t] += f[i - 1][j][k][l];
}
modint ans = 0;
FOR(i, 1, m) FOR(j, i + 1, m) FOR(k, j + 1, m) ans += f[n][i][j][k];
print(ans);
return output(), 0;
}
ABC237G - Range Sort Query
给定长度为 N N N 的排列, Q Q Q 次操作,操作为选定一区间 [ l , r ] [l, r] [l,r] 然后升序/降序排序,问元素 X X X 最后的下标在哪里。 1 ≤ N , Q ≤ 2 × 1 0 5 1\le N, Q\le 2\times 10^5 1≤N,Q≤2×105。
这是一个经典问题(HEOI 排序)的变式。最强大的解法显然为线段树合并/分裂,但是在这里不需要。
注意到,0-1 序列的区间排序很好使用线段树来完成,只需要实现区间染色和区间求和。所以我们考虑将其转为 0-1 序列。
具体地,将 < X < X <X 的元素变为 0 0 0,其他变为 1 1 1,操作,得到一个结果。将 ≤ X \le X ≤X 的元素变为 0 0 0,其他变为 1 1 1,操作,得到另一个结果,然后然后然后发现这两个序列唯一一个不一样的地方显然就是 X X X 最后的位置。
所以复杂度为 O ( N log N ) O(N\log N) O(NlogN),视 N N N 和 Q Q Q 同阶。评测记录。
ABC237Ex - Hakata
给定长度 ≤ 200 \le 200 ≤200 的字符串 S S S,问最多能从里面选出多少个回文子段,使得一个子段不是另一个子段的子段。子段指连续的。
我们发现,不同回文子串的个数 ≤ ∣ S ∣ \le |S| ≤∣S∣,然后子串间的包含关系是一种偏序关系,可以形成一个 DAG,而原问题问的就是其的最大反链。
复习一下 P4298 [CTSC2008]祭祀 便知道最大反链 = 最小链覆盖(Dilworth 引理),而最小链覆盖可以通过拆点二分图匹配来求。
放到本题里面,就对于每个不同回文子段(这部分顶天 O ( ∣ S ∣ 3 ) O(|S|^3) O(∣S∣3)),为其标号,然后对于 i i i 为 j j j 的子串,连边 i l e f t → j r i g h t i_{\mathrm {left}}\to j_{\mathrm{right}} ileft→jright,然后跑二分图最大匹配,用回文串数量减去匹配即得到答案。时间复杂度就不分析了, 400 400 400 个点的二分图匹配并不慢,评测记录。