首页 > 其他分享 >sol. [省选联考 2021 A/B 卷] 滚榜

sol. [省选联考 2021 A/B 卷] 滚榜

时间:2023-12-22 23:44:49浏览次数:45  
标签:le limits 省选 sum int 2021 mathcal 联考 define

[省选联考 2021 A/B 卷] 滚榜

算法标签:状压 DP,差分,费用提前计算。

题目描述

给定 \(n\) 个非负整数 \(a_1, a_2, \dots, a_n\),定义 \(d_i\) 表示以 \(a_i\) 为第一关键字降序排序,以 \(i\) 为第二关键字升序排序后的下标。现有 \(n\) 个非负整数 \(b_1, b_2, \dots, b_n\),满足 \(\sum_{i = 1}^{n} b_i = m\),且满足以 \(b_i\) 不降的顺序,依次将 \(a_i\) 变成 \(a_i + b_i\),更新 \(d_i\) 后,\(d_i\) 均为 \(1\)。求最终有多少种不同的 \(d\) 数组。

数据范围:\(1 \le n \le 13\),\(1 \le m \le 500\),\(0 \le a_i \le {10}^4\)。

题解

注意到这个每次 \(d_i = 1\) 的限制很强,所以首先分析它的性质。

对于一个排列 \(p\),表示选择 \(b_i\) 的顺序为 \(\{ p_1, p_2, p_3 \dots p_n\}\),那么 \(\forall i \in [1,n]\),都有 \(d_{p_i} = n - i + 1\),答案就等价于求 \(p\) 的种类数。

我们以 \(p\) 的顺序,每次贪心地选取最小的 \(b_i\),那么 \(p\) 符合条件等价于 \(\sum\limits_{i = 1}^n b_i \le m\),形式化地讲,我们定义:

\[f(i, j) = \max(a_{i} - a_{j} + [i < j], \, 0) \]

那么容易写出 \(b_i\) 的递推式:

\[b_{p_{i}} = b_{p_{i -1}} + f(p_{i - 1}, p_i) \]

通过 \(f(i,j)\) 函数,让我们可以保证 \(b_{p_i}\) 单调不降,即 \(b_{p_{i-1}} \le b_{p_i}\),还可以保证进行到 \(p_i\) 时都让 \(d_{p_i} = 1\),所以我们能在 \(\mathcal{O}(n)\) 的时间复杂度内判断一个 \(p\) 的合法性。

至此,我们已经有了一个 \(\mathcal{O}(n! \times n)\) 的算法。

考虑状压 dp,记 \(t = |S|\),容易设计出朴素状态 \(g_{S, i, j, k}\),表示目前的 \(\{ p_1, p_2, \dots p_t\}\) 的集合为 \(S\),且 \(p_t = i\),\(b_i = j\),\(\sum\limits_{x \in S} b_x = k\),则直接转移的复杂度为 \(\mathcal{O}(2^nn^2m^2)\),无法通过。

由于现在的限制只剩下 \(\sum\limits_{i = 1}^n b_i \le m\) 未完全处理完。通过前面提到 \(b\) 数组的性质,\(\sum\limits_{x \in S} b_x\) 是完全可以利用 \(b\) 数组的差分数组,即 \(f(i, j)\) 快速计算的,因此 \(j\) 这一维可以删去,容易写出新的转移方程:

\[g_{S,i,k} = \sum_{j \in S, j \ne i} g_{S- \{i \}, j, k - f(j, i)} \]

注意 dp 的初值,时间复杂度为 \(\mathcal{O}(2^nn^2m)\)。

#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define MULT_TEST 0
using namespace std;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
const int MOD = 998244353;
const int N = 15, R = (1 << 13) + 5, M = 505;
int dp[R][N][M], a[N];
inline int read() {
    int w = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        w = (w << 1) + (w << 3) + ch - 48;
        ch = getchar();
    }
    return w * f;
}
inline void Solve() {
    int n, m, mx = 0;
    n = read(); m = read();
    for (int i = 0; i < n; i++) {
        a[i] = read();
        if (a[i] > a[mx]) mx = i;
    } 
    for (int i = 0; i < n; i++) {
        int r = max(a[mx] - a[i] + (i > mx), 0ll);
        dp[1 << i][i][r * n] = 1;
    }
    for (int S = 1; S < (1 << n); S++) {
        int c = __builtin_popcount(S);
        if (c == 1) continue;
        for (int i = 0; i < n; i++) {
            if (!((S >> i) & 1)) continue;
            for (int j = 0; j < n; j++) {
                if (i == j || !((S >> j) & 1)) continue;
                int r = max(a[j] - a[i] + (i > j), 0ll) * (n - c + 1);
                for (int k = r; k <= m; k++) dp[S][i][k] += dp[S ^ (1 << i)][j][k - r];
            }
        }
    }
    int ans = 0;
    for (int i = 0; i < n; i++) 
        for (int j = 0; j <= m; j++) 
            ans += dp[(1 << n) - 1][i][j];
    printf("%lld\n", ans);
}
signed main() {
    int T = 1;
#if MULT_TEST
    T = read();
#endif 
    while (T--) Solve();
    return 0;
}

标签:le,limits,省选,sum,int,2021,mathcal,联考,define
From: https://www.cnblogs.com/WTR2007/p/17922553.html

相关文章

  • [PA2021] Wystawa
    [PA2021]Wystawa牛逼啊喔趣。题意给定长度为\(n\)的序列\(a,b\)。你需要构造一个序列\(c\),构造方法为:选择\(k\)个\(i\),令\(c_i\leftarrowa_i\)。对于其他\(i\),令\(c_i\leftarrowb_i\)。求序列\(c\)的最大子段和的最小值,并给出一种方案。Sol感觉最小......
  • 20211327 嵌入式基础
    嵌入式基础信息安全系统有时间戳的需求,因此密码系统有实时钟芯片。假设实时钟芯片的IO映像基址是全局变量unsigntedintTIME的指针地址,时间存放在(基址+2)的寄存器中(默认值为当前时间),寄存器是16位,结构如附件中图所示按照下图给出TIME的注释(6‘)定义基于16位寄存器的宏(4‘)使......
  • Microsoft Visio 2021专业版安装包软件下载安装教程
    Microsoftvisio2021,简称visio2021。这是一款专业的专业矢量绘图软件。visio2021不但新增了许许多多的功能,而且还优化了众多的界面性能,其一系列的改动就是为了给予用户们最直观、最便利的操作感体验。同时呢,软件的操作也是相当的简单,只要用户熟悉软件上方中的菜单栏,其菜单栏与大家......
  • P5289 [十二省联考 2019] 皮配 题解
    题目链接点击打开链接题目解法题意比较复杂,形式化一下题意是:一些人和一些城市,每个人属于一个城市,每个人属于\(A/B/C/D\)队,需要满足:每个城市中的人要么都属于\(AC\)或\(BD\),且\(A+C\leC_0,\;B+D\leC_1,\;A+B\leD_0,\;C+D\leD_1\)暴力\(dp\)是\(f_{i,a,b,c}\)表......
  • NOIP2021 sol
    20231201-20231221NOIP2021solA.[NOIP2021]报数[NOIP2021]报数设\(p(x)\)表示\(x\)的十进制表示中是否含有数字\(7\),若含有则\(p(x)=1\),否则\(p(x)=0\)。则一个正整数\(x\)不能被报出,当且仅当存在正整数\(y\)和\(z\),使得\(x=yz\)且\(p(y)=1\)。......
  • 管理类联考和普通考研区别有哪些?对比分析!
    在当今社会,越来越多的大学生选择继续深造,提升自己的学历和能力。其中,管理类联考和考研是两个常见的选择。然而,许多人对于这两者的区别并不了解,因此在选择的时候往往会感到困惑。本文将详细介绍管理类联考和考研区别有哪些,帮助大家更好地理解和选择。 一、考试性质的区别 1.管理......
  • Nacos未授权 CVE-2021-29441
    Nacos未授权CVE-2021-29441环境搭建环境dockerfile在文末环境启动docker-composeup-d查看下当前的容器dockerps漏洞复现访问Web页面127.0.0.1:8848抓包,访问http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=2将User-Agent的值修改为Nacos-Server......
  • P7831 [CCO2021] Travelling Merchant
    题意不多赘述。注:全文所用的“点\(u\)的出度”均指的是点\(u\)在原图上的出度。首先我们考虑\(r_{i}=0\)的情况怎么写,这时我们会发现要么答案是\(0\)要么无解。当当前点\(u\)无论怎么走都走不到一个环上,即无论怎么走最终都会走到一个出度为\(0\)的点上的话,那么显......
  • P8386 [PA2021] Od deski do deski 题解
    显然是一道计数dp。dp状态应该是最难的一部分了,个人认为这种状态设计得比较巧妙。如果像我刚开始一样设\(dp_{i,j}\)表示序列中一共有\(i\)个数,序列最后一个数为\(j\)的合法方案数的话,那么方程就会变得很不好转移,因为我们不知道当前的\(j\)和之前的某些数能不能匹配上,......
  • 1 K8S for Prometheus Dashboard 20211010 EN
    *[PrometheusTimeSeriesCollectionandProcessingServer](http://localhost:9090/targets?search=#pool-prometheus)*[Dashboards|GrafanaLabs](https://grafana.com/grafana/dashboards/?search=prometheus)*[Alertmanager|GrafanaLabs](https://grafana.com/g......