• [NOI Online #2 入门组]建设城市


    Description

    球球是一位建筑师。一天,他收到市长的任务:建设城市。球球打算建造 $2n$ 座高楼。为了保证城市美观,球球做出了如下计划:

    球球喜欢整齐的事物。他希望高楼从左向右排成一行,编号依次为 $1sim 2n$。

    球球喜欢整数,他要求每座高楼的高度都是正整数。

    由于材料限制,高楼的高度无法超过 $m$。

    球球喜欢中间高,两边低的造型。他要求前 $n$ 座高楼的高度不下降,后 $n$ 座高楼的高度不上升。

    球球打算选两座编号为 $x,y$ 的高楼作为这座城市的地标。他认为只有当这两座高楼高度相等时,才会让城市变得美观。

    球球把自己的想法告诉了市长。市长希望得知所有建设城市的方案数。两种方案不同,当且仅当某座高楼的高度在两个方案中不同。这个问题可难倒了球球。球球找到了你,希望你能帮他算出答案。由于答案可能很大,你只需要给出答案对 $998244353$ 取模后的结果。

    Solution

    记 $h_i$ 表示第 $i$ 个楼的高度。题意就是说求满足下面三个条件的数列的个数:

    1. $h_1 le h_2 le cdots le h_n, h_{n+1} ge h_{n+2} ge cdots ge h_{2n}$
    2. $h_x = h_y$
    3. $forall 1 le i le 2n, h_i in [1, m]$

    如果没有 $h_x = h_y$ 的限制,方案数应该是什么呢?

    显然上升部分和下降部分的方案数是相等的,我们只考虑前面一个部分(也就是用 $[1, m]$ 拼长度为 $n$ 的不下降序列的方案数 $f(n, m)$)。利用隔板法的思想,可以先把楼排成一行,在中间依次插上 $m - 1$ 个隔板,相邻两个隔板之间的楼的高度相等,求不同的插法。

    当然,这时可能会有多个隔板在一个位置,比如楼房高度为 ${1, 1, 3}$ 时,隔板的插法就是 ${ circ circ | | circ }$。

    这违背了隔板法的要求,所以我们加 $m$ 个楼进去,确保这些新加的楼的高度分别为 $1 sim m$,然后就可以用隔板法了。

    比如 $m = 3$,${ circcirc |circ |circcirc }$ 这种插法对应的就是 ${1, 3}$,因为我们要在每两个隔板见去掉一个。

    所以,相当于是有 $n + m$ 个楼,插 $m - 1$ 个隔板的方案数。隔板显然是插在间隔里,$n + m$ 个楼有 $n+m-1$ 个间隔,所以,方案数就是:

    $$ f(n, m)=inom{n+m-1}{m-1} $$

    接下来,考虑加上 $h_x = h_y$ 的条件。

    • 如果 $x, y$ 在同一侧,那么显然 $h_x , h_{x+1} cdots h_y$ 都是相等的,可以视作一个楼(所以少了 $y - x$ 个楼),所以,这一侧的方案数就是 $f(n - (y - x), m) = f(n + x - y, m)$,另一侧不变,也就是 $f(n, m)$。综上,答案为:

    $$ f(n+x-y, m) imes f(n, m) $$

    • 如果 $x, y$ 不在同一侧,不妨枚举一下 $h_x$ 等于多少,比如枚举到的是 $h_x = i$,那么序列会分为 $4$ 段:
    1. $h_1 sim h_{x - 1}$ 这 $x - 1$ 个楼应当 $in [1, i]$,所以方案数为 $f(x - 1, i)$;
    2. $h_{x+1} sim h_n$ 这 $n - x$ 个楼应当 $in[i, m]$,所以方案数为 $f(n - x, m - i + 1)$;
    3. $h_{n+1} sim h_{y-1}$ 这 $y-n-1$ 个楼应当 $in[i, m]$,所以方案数为 $f(y-n-1, m - i + 1)$;
    4. $h_{y+1} sim h_{2n}$ 这 $2n - y$ 个楼应当 $in[1, i]$,所以方案数为 $f(2n - y, i)$。

    然后,对于每个 $i$ 的加起来就是了,也就是说,答案为:

    $$ sum_{i=1}^{m} f(x - 1, i) imes f(n - x, m - i + 1) imes f(y-n-1, m - i + 1) imes f(2n - y, i) $$

    提前 $O(n)$ 预处理阶乘和逆元,这题就解决了,情况 1 计算时间复杂度 $O(1)$,情况 2 是 $O(m)$,可以通过此题,代码就不贴了。

    其实把 n 开到 1e9 也没啥呀,分块打表很香啊

  • 相关阅读:
    调度器2—cat /proc/<pid>/sched内容分析
    调度器1—相关接口和命令行工具
    Java中的String类
    Java中的数组
    代码访问使用Let's Encrypt证书的网站提示certificate has expired的解决方法
    Linux环境Clion使用Protobuf
    PyTorch Dataloader读取时如何在进程之间传输数据
    6 安装Grafana 展示promethues数据
    5 Prometheus relabel配置
    4 PromQL
  • 原文地址:https://www.cnblogs.com/syksykCCC/p/NOIO2-J3.html
Copyright © 2020-2023  润新知