AtCoder Beginner Contest 237 题解(A - Ex)

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 3N1000 3 ≤ M ≤ 10 3\le M\le 10 3M10

考虑经典的 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 1N,Q2×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(S3)),为其标号,然后对于 i i i j j j 的子串,连边 i l e f t → j r i g h t i_{\mathrm {left}}\to j_{\mathrm{right}} ileftjright,然后跑二分图最大匹配,用回文串数量减去匹配即得到答案。时间复杂度就不分析了, 400 400 400 个点的二分图匹配并不慢,评测记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值