首页 > 其他分享 >P8865 [NOIP2022] 种花

P8865 [NOIP2022] 种花

时间:2022-12-04 14:13:22浏览次数:78  
标签:ch 画法 int texttt times read P8865 种花 NOIP2022

P8865 NOIP2022 种花 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

记 \(a(x, y)\) 代表原文的 \(a_{x, y}\)。

考虑对每个点统计:左上角在该点的 \(\texttt{C-}\),\(\texttt{F-}\) 的数量。最终答案累加每个点对应的答案即可。

那么接下来我们想:对于一个点怎么计算对应的答案?我们生成一个地图来看看:

其中白色代表可以放置花,红色代表不可放置。现在,我们要计算左上角在 \((1, 1)\) 的 \(\texttt{C-}\) 的数量。

较容易看出,\(\texttt{C-}\) 的最上面那一横总共有 \(3\) 种画法,下面是其中一种:

考虑 \(3\) 的意义,其实它是从 \((1, 1)\) 开始,往右最多有几个连续的白色方块(不统计 \((1, 1)\) 本身)。

据此,我们考虑预处理 \(r(x, y)\) 表示 \((x, y)\) 开始向右最多有几个连续的 \(0\)(不统计 \((x, y)\) 本身)。特别地,当 \(a(x, y) = 1\) 时,记 \(r(x, y) = -1\)。

\(r\) 可以通过 \(\Theta(nm)\) 的递推(或者说后缀和)得到,具体来说,当 \(a(x, y) = 1\) 时,\(r(x, y) = -1\),否则 \(r(x, y) = r(x, y + 1) + 1\)。边界是 \(r(x, m +1) = -1\)。

那么 \(\texttt{C-}\) 的剩下一部分(先下再右的整个一个折线)有多少种画法呢?我们发现:

  • 当 \(\texttt{C-}\) 的一竖延伸到 \((3, 1)\) 时,剩下一部分有 \(r(3, 1) = 3\) 种画法;
  • 当 \(\texttt{C-}\) 的一竖延伸到 \((4, 1)\) 时,剩下一部分有 \(r(4, 1) = 0\) 种画法;
  • 当 \(\texttt{C-}\) 的一竖延伸到 \((5, 1)\) 时,剩下一部分有 \(r(5, 1) = 5\) 种画法;
  • 当 \(\texttt{C-}\) 的一竖延伸到 \((6, 1)\) 时,剩下一部分有 \(r(6, 1) = 1\) 种画法。

因此剩下这部分总共有 \(r(3, 1) + r(4, 1) + r(5, 1) + r(6, 1) = 9\) 种画法。根据乘法原理可以得到,以 \((1, 1)\) 为左上角的 \(\texttt{C-}\) 数量有 \(3 \times 9 = 27\) 个。

一般地,\((x, y)\) 对应的 \(\texttt{C-}\) 数量可以表示为 \(r(x, y) \times \sum\limits_{t = x + 2} ^ k r(t, y)\),其中 \(k\) 满足:\(a(x, y) = a(x + 1, y) = \cdots = a(k, y) = 0\),而 \(a(k + 1, y) = 1\),此处我们认为 \(a(n + 1, y) = 1\)。

这里 \(k\) 的存在是考虑 \(\texttt{C-}\) 的那一竖,有时并不能像上面那个例子一样无限向下延伸,如果遇到一个红色方块就需要停止了。比如,若上面的 \((5, 1)\) 是红色,那么 \((1, 1)\) 对应的 \(\texttt{C-}\) 中,除去上面一横的剩下一部分,只剩下 \(r(3, 1) +r(4, 1) = 3\) 种画法。

为了让式子仍然可以 \(\Theta(1)\) 直接计算,我们考虑预处理 \(g(x, y) = \sum \limits _{t=x} ^ k r(t, y)\),\(k\) 的含义和上面相同。递推和 \(r\) 差不多:当 \(a(x, y) = 1\) 时,\(g(x, y) = 0\),否则 \(g(x, y) = g(x + 1, y) +r(x, y)\)。边界是 \(g(n + 1, y) = 0\)。

这样以来,当 \(a(x, y) = 0\) 且 \(a(x + 1, y) = 0\) 时,\((x, y)\) 对应的 \(\texttt{C-}\) 数量就为 \(r(x, y) \times g(x + 2, y)\),否则显然为 \(0\)。请注意检验 \(a(x + 1, y)\) 为 \(0\) 的必要性

接下来计算 \(\texttt{F-}\)。还是上面这个例子,上面那一横的画法显然还是 \(r(1, 1) = 3\)。

剩下一部分因为形状的变化,画法数量也会有变化。当 \(\texttt{F-}\) 的上半竖延伸到 \((3, 1)\) 时,第二个横有 \(r(3, 1) = 3\) 种画法,这个仍然不变。但此时我们还要考虑下半竖,总共还有 \(6 - 3 = 3\) 种画法。因此,当 \(\texttt{F-}\) 的上半竖延伸到 \((3, 1)\) 时,除了第一横的剩下一部分总共有 \(3 \times 3 = 9\) 种画法。而当 \(\texttt{F-}\) 上半竖延伸到 \((5, 1)\) 时,总共有 \(r(5, 1) \times (6 - 5) = 5\) 种。其实也就是在 \(\texttt{C-}\) 的基础上,再套一个乘法原理将下半竖的画法统计进去。

类似一般地,\((x, y)\) 对应的 \(\texttt{F-}\) 数量可以表示为 \(r(x, y) \times \sum \limits _{t = x +2} ^ k r(t, y) \times (k - t)\),其中 \(k\) 满足:\(a(x, y) = a(x + 1, y) = \cdots = a(k, y) = 0\),而 \(a(k + 1, y) = 1\),我们认为 \(a(n + 1, y) = 1\)。

预处理 \(h(x, y) = \sum \limits _{t = x} ^ k r(t, y)\),当 \(a(x, y) = 1\) 时,\(h(x, y) = 0\),否则 \(h(x, y) = h(x +1, y) + r(x, y) \times (k - t)\)。边界是 \(h(n +1, y) = 0\)。

这样以来,当 \(a(x, y) = 0\) 且 \(a(x + 1, y) = 0\) 时,\((x, y)\) 对应的 \(\texttt{F-}\) 数量就为 \(r(x, y) \times h(x + 2, y)\),否则显然为 \(0\)。

时间复杂度 \(\Theta(nm)\)。

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2022-12-01 11:11:02 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2022-12-01 12:02:12
 */
#include <bits/stdc++.h>
#define int long long
inline int read() {
    int x = 0;
    bool f = true;
    char ch = getchar();
    for (; !isdigit(ch); ch = getchar())
        if (ch == '-')
            f = false;
    for (; isdigit(ch); ch = getchar())
        x = (x << 1) + (x << 3) + ch - '0';
    return f ? x : (~(x - 1));
}
inline std :: pair <std :: string, int> rest(bool space = true) {
    std :: string s;
    char ch = getchar();
    for (; !isgraph(ch); ch = getchar());
    for (; isgraph(ch); ch = getchar())
        s.push_back(ch);
    return {space ? " " + s : s, s.length()};
}

const int maxn = 1005;
const int maxm = 1005;
const int mod = 998244353;

bool a[maxn][maxm];
int r[maxn][maxm], g[maxn][maxm], h[maxn][maxm];

signed main() {
    int T = read(); read();
    while (T--) {
        std :: memset(r, -1, sizeof(r));
        std :: memset(g, 0, sizeof(g));
        std :: memset(h, 0, sizeof(h));

        int n = read(), m = read(), C = read(), F = read();

        for (int i = 1; i <= n; ++i) {
            std :: string s = rest().first;
            for (int j = 1; j <= m; ++j)
                a[i][j] = (s[j] == '1');
        }

        for (int i = 1; i <= n; ++i)
            for (int j = m; j; --j)
                r[i][j] = a[i][j] ? -1 : (r[i][j + 1] + 1);
        
        for (int i = n; i; --i)
            for (int j = 1; j <= m; ++j)
                g[i][j] = a[i][j] ? 0 : ((g[i + 1][j] + r[i][j]) % mod);

        for (int j = 1; j <= m; ++j) {
            for (int i = n, k = n; i; --i) {
                if (a[i][j])
                    k = i - 1;
                else
                    h[i][j] = (h[i + 1][j] + r[i][j] * (k - i)) % mod;
            }
        }
        
        int c = 0, f = 0;
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                if (a[i][j] || a[i + 1][j])
                    continue;
                (c += r[i][j] * g[i + 2][j]) %= mod;
                (f += r[i][j] * h[i + 2][j]) %= mod;
            }
        }

        printf("%lld %lld\n", c * C, f * F);
    }

    return 0;
}

标签:ch,画法,int,texttt,times,read,P8865,种花,NOIP2022
From: https://www.cnblogs.com/crab-in-the-northeast/p/luogu-p8865.html

相关文章

  • P8866 [NOIP2022] 喵了个喵
    P8866NOIP2022喵了个喵-洛谷|计算机科学教育新生态(luogu.com.cn)。本题解中我们将图案为\(x\)的卡牌看做数字\(x\),将本题对于卡牌的操作看做对数字的操作。观......
  • NOIP2022游寄
    真的是游了,寄了Day0预感要爆炸,背了背模板(虽然没用上)Day1感觉不怎么好,买了瓶咖啡,到考场的时候发现掉了,555提前进入考场静坐密码是biu#2019miss和???(记不到了)提前......
  • NOIP2022T3
    NOIP2022T3建造军营题解[NOIP2022]建造军营题目描述A国与B国正在激烈交战中,A国打算在自己的国土上建造一些军营。A国的国土由\(n\)座城市组成,\(m\)条双向道路......
  • NOIP2022 题解
    A.种花有的人把名字写进题面,想“不朽”。签到题。枚举c和f的最左边那一列的位置,然后做一个类似前缀和的东西。B.喵了个喵压轴题。首先\(k=2n-2\)有一个非常好......
  • NOIP2022T1题解
    [NOIP2022]种花(民间数据)题目描述小C决定在他的花园里种出\(\texttt{CCF}\)字样的图案,因此他想知道\(\textttC\)和\(\textttF\)两个字母各自有多少种种花的方......
  • NFLSPC #5 & NOIP2022 游记
    Day?接到百度之星决赛电话的时候,区运会还没有推迟,我也不知道这周末会补考。这样NOIP,区运会,百度之星,还有补考,成功撞在了周末短短两天内。我为区运会推掉了百度之星的邀......
  • P8866 [NOIP2022] 喵了个喵
    \(\mathcalLink\)当\(k=2n-2\):保证任意时刻每种元素只出现一次,并保留一个空栈,让其他栈大小不超过\(2\)即可。当\(k=2n-1\):延续上面的做法,对于多出来的第\(2n-1\)......
  • NOIP2022 游记
    怕不是真要NOIP退役了……Day-10果断停课,回归机房。(但whk已经在上三角函数了……血亏,以后再补吧)补了补之前的题目。晚上模拟赛爆零了!!好耶(埋伏笔)Day-9~Day-5......
  • NOIP2022 VP 游寄
    考前给大家说一下我糟糕的模拟赛成绩:\(\operatorname{rk}29\)(总人数\(32\))感觉NOIP2022无望了。(最后再说一句,我的CSP/S太菜了,才\(165\)分,无缘NOIP正式名额,只......
  • NOIP2022
    NOIP2022总结考前早上主要看了点随机化和部分分写法什么的感觉有点脱离了大纲,图论那块一直不是很好也没怎么复习有点紧张,尽管不是现场赛,但是还是有点怕分数太低QA......