首页 > 其他分享 >P9891 [ICPC2018 Qingdao R] Repair the Artwork 题解

P9891 [ICPC2018 Qingdao R] Repair the Artwork 题解

时间:2024-09-14 15:51:01浏览次数:12  
标签:Repair P9891 int 题解 容斥 ret 区间 dp mod

所求即为选择的区间恰好包含所有 \(a_i = 2\) 的位置的方案数。

设所有 \(a_i = 2\) 的位置 \(i\) 组成集合 \(S\),考虑容斥被选中的位置是 \(S\) 的子集的方案数 \(g(S)\)。

设 \(T\) 为 \(S\) 的子集,\(T\) 的贡献 \(f(T)\) 为:选中的位置都在 \(T\) 的子集中的方案数乘容斥系数 \((-1)^{|S| - |T|}\)。

将所有 \(i \in T\) 视为 \(a_i = 0\)(可选可不选);将所有 \(i \in U - T\) 视为 \(a_i = 1\)(必须不选)。\(f(T)\) 可重新表述为不包含 \(1\) 的区间的数量的 \(m\) 次方(一个区间允许多次选,方案有序)。

只需求满足条件的区间数量,设所有被视为 \(a_i = 1\) 的位置 \(i\) 依次组成长为 \(m\) 的数列 \(b_1, b_2, \cdots b_m\),则满足条件的区间数量为

\[\sum\limits_{i = 2}^m \frac 1 2 (b_i - b_{i - 1}) (b_i - b_{i - 1} - 1) \]

考虑 DP,发现答案只与 \(b\) 的上一项有关,设 \(dp_{i, j}\) 表示 \(i\) 被视为 \(a_i = 1\),区间数量为 \(j\) 的方案数。(为了方便初始化和统计答案,规定 \(a_0 = a_{n + 1} = 1\))

转移

\[dp_{k, j + w} = \sum\limits_{i = 0}^{k - 1} c_i \cdot dp_{i, j} \]

其中 \(c_i\) 是容斥系数,\(w\) 是权值。

发现容斥系数的指数实际上是有多少个 \(a_i = 2\) 被视为 \(a_i = 1\),所以

\[c_i = \begin{cases} 1, &a_i = 1, \\ -1, &a_i = 2, \\ 0, &\text{otherwise}. \end{cases} \]

该式中 \(a_i\) 是原数列中的 \(a_i\)。

\[w = \frac 1 2 (k - i) (k - i - 1) \]

边界

\[dp_{0, 0} = 1 \]

答案

\[\sum\limits_{x = 1}^{\frac 1 2 n (n + 1)} dp_{n + 1, x} \cdot x^m \]

#include <iostream>

#define int long long

using namespace std;

const int mod = 1e9 + 7;

static inline int qpow(int a, int b) {
    int ret = 1;
    while (b) {
        if (b & 1)
            ret = ret * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ret;
}

int n, m;
int a[105];
int dp[105][10005];

static inline void solve() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    for (int i = 0; i <= n + 1; ++i) {
        int mx = n * (n + 1) / 2;
        for (int j = 0; j <= mx; ++j)
            dp[i][j] = 0;
    }
    a[n + 1] = 1;
    dp[0][0] = 1;
    for (int i = 0; i <= n; ++i) {
        int mx = i * (i + 1) / 2;
        for (int j = 0; j <= mx; ++j) {
            for (int k = i + 1; k <= n + 1; ++k) {
                int w = (k - i) * (k - i - 1) / 2;
                if (a[k] == 1) {
                    dp[k][j + w] = (dp[k][j + w] + dp[i][j]) % mod;
                    break;
                } else if (a[k] == 2) {
                    dp[k][j + w] = (dp[k][j + w] - dp[i][j] + mod) % mod;
                }
            }
        }
    }
    int mx = n * (n + 1) / 2;
    int ans = 0;
    for (int i = 0; i <= mx; ++i)
        ans = (ans + dp[n + 1][i] * qpow(i, m) % mod) % mod;
    cout << ans << endl;
}

signed main() {
#ifndef ONLINE_JUDGE
    freopen("P9891.in", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

标签:Repair,P9891,int,题解,容斥,ret,区间,dp,mod
From: https://www.cnblogs.com/bluewindde/p/18414211

相关文章

  • [题解]CF542A Place Your Ad Here
    思路首先因为电视台比广告多一个信息,所以通常来说枚举电视台是更有前途的。因此枚举每一个电视台,考虑所有广告的贡献。对于一个电视台,\(c_i\)是定值,也就是找到所有广告与电视台所表示区间交得最多的那一个。假设枚举的电视台控制了\([L,R]\)区间,则广告\([l,r]\)会有三种方......
  • Luogu P10179 水影若深蓝 题解 [ 绿 ] [ 并查集 ] [ 构造 ]
    水影若深蓝:挺好的一道并查集构造题。观察不难发现“距离为\(2\)”这个条件我们可以通过黑白染色实现,我们把他们的中转点染成与他们相反的颜色,把这两个距离为\(2\)的点染成相同颜色。这个染色问题就很并查集。于是我们用并查集维护相同的种类。显然,当图上只有一个连通块的......
  • 请求HTTP链接的图片等资源被自动变成HTTPS请求的问题解决(顺便可以解决图片防盗链)
    文章目录问题现象问题根本原因常规问题解决办法非Chrome浏览器:控制CSP协议对HTML页面处理nginx配置中处理Chrome浏览器本地处理方式Chrome浏览器通用解决办法(服务器端无法控制新版Chrome这种行为,只能曲线救国--顺便可以解决图片防盗链)网页的网站使用http域名代理服务......
  • P5985 [PA2019] Muzyka pop 题解
    P5985[PA2019]Muzykapop题解是蛮有意思的一道题。\(n\le200\),第一感觉是区间dp,但是又不好设出状态。考虑\(b\)单调递增的过程中的性质,考虑后得到\(b\)的最高含\(1\)的位一定是单调不降的,于是我们考虑将最高的含\(1\)的位设入状态。第一反应是设\(f_{i,j}\)表示......
  • 力扣494-目标和(Java详细题解)
    题目链接:494.目标和-力扣(LeetCode)前情提要:因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。如果大家感兴趣,......
  • 《Civilization: Beyond Earth》启动失败?《文明太空》msvcr110.dll问题解决方案大放送
    当您在尝试启动《文明:太空》(Civilization:BeyondEarth)时遇到“找不到msvcr110.dll”或“msvcr110.dll缺失”的错误提示,这意味着您的计算机上缺少或损坏了MicrosoftVisualC++2012运行时库中的一个关键组件。msvcr110.dll是许多基于C++开发的游戏和应用程序正常运行所必需的......
  • Thinkpad C13 Yoga Linux声卡驱动问题解决方案等
    ChromebookMorphius:ThinkpadC13Yoga与linux这本子做工真不错,全铝触摸屏,360翻折,还有usi笔槽。续航也很长,能连续用8个小时。安装linuxcoolstar.org,请。如果运行那个脚本有困难(网络问题),你可以尝试打开那个脚本看看biosrom是从哪里下载的。手动下载后用脚本里的flashrom那......
  • 【洛谷 P5266】【深基17.例6】学籍管理 题解(映射+分支)
    【深基17.例6】学籍管理题目描述您要设计一个学籍管理系统,最开始学籍数据是空的,然后该系统能够支持下面的操作(不超过条):插入与修改,格式1NAMESCORE:在系统中插入姓名为NAME(由字母和数字组成不超过20个字符的字符串,区分大小写),分数为()的学生。如果已经有同名的学生则更新这名......
  • [EGOI2024] Infinite Race题解
    [EGOI2024]InfiniteRace妙妙题。我们设\(cnt[x]\)表示当Anika和第\(x\)位选手相遇时Anika至少几次经过终点线。设定初始状态\(cnt[x]=-1\)表示两种等价的情况:Anika还未和第\(x\)位选手相遇过Anika被第\(x\)位选手超越了因此只剩下Anika超越了第\(x\)位选手......
  • 洛谷P8208 [THUPC2022 初赛] 骰子旅行 题解 期望DP
    题目链接:https://www.luogu.com.cn/problem/P8208解题思路:定义\(d_u\)表示节点\(u\)的出度,定义\(V_u\)表示节点\(u\)一步能够走到的节点的集合。定义状态\(p_{u,c,v}\)表示从节点\(u\)出发走恰好\(c\)步的情况下,至少经过一次节点\(v\)的概率。则:若\(v=......