套路题

题意

求有多少个 \(1\) 到 \(n\) 的排列满足恰有 \(k\) 对在排列中相邻的数满足前小于后

\(2 \leq n \leq 500, 0 \leq k \leq (n - 1)\)

思路

f[i][j][k] 表示已经放置了前 i 个数, 放置的第i个数是前i个数中第j大的($ 1\leq\(`j`\)\leq$i),已放置的前i个数形成的所有排列满足恰有 k 对在排列中相邻的数满足前小于后的排列数量。

放置第i+1个数时,第i+1个数是前i+1个数中第j大的,第i个数是严格小于前i个数中第j大的,会为排列增加一对相邻的数满足前小于后,第i个数是大于等于前i个数中第j大的,不会为排列增加一对相邻的数满足前小于后,转移方程为:

\[f_{(i + 1) j k} = \sum_{x = 1}^{j - 1}f_{i x (k-1)} + \sum_{x=j}^{i}f_{ixk}
\]

显然,后面的和式可以通过前缀和优化的。

时间复杂度为\(O(n^2k)\)。

G - Similar Permutation

传送门

题意

求\(1\)到\(n\)的排列\(A\) 和 \(B\)的相似度为\(k\)的数量。

相似度计算:\(k = \sum_{i = 2}^{n}[(A_i - A_{i-1})(B_i - B_{i-1}) > 0]\) (\([X] = 1, X 为真,[X] = 0, X为假\))。

\(2 \leq n \leq 100, 0 \leq k \leq (n - 1)\)。

思路

与前一道题相比,这一题只是增加了一维状态。

f[i][a][b][k] 表示排列\(A\),\(B\)已经放置了前 i 个数, 排列\(A\)放置的第i个数在排列\(A\)中是第a大的,排列\(B\)放置的第i个数在排列\(B\)中是第b大的,此时相似度为\(k\)的排列数量。

转移方程为:

\[f_{(i+1)abk} = \sum_{x = 1}^{a - 1}\sum_{y = 1}^{b - 1} f_{ixy(k-1)} +
\sum_{x = a}^{i}\sum_{y = b}^{i} f_{ixy(k-1)} +
\sum_{x = 1}^{a - 1}\sum_{y = b}^{i} f_{ixyk} +
\sum_{x = a}^{i}\sum_{y = 1}^{b - 1} f_{ixyk}
\]

和式同样可以使用前缀和来优化。

时间复杂度为\(O(n^4)\)。

代码

int pre[107][107][107], f[107][107][107];
void solve_problem() {
int n, m, P; std::cin >> n >> m >> P; auto add = [&](int a, int b) -> int {
a += b;
if ( a >= P ) a -= P;
return a;
};
auto sub = [&](int a, int b) -> int {
a -= b;
if ( a < 0 ) a += P;
return a;
};
auto sum = [&](int n, int x1, int y1, int x2, int y2) -> int {
if (n < 0) return 0;
return add(sub(sub(pre[n][x2][y2], pre[n][x2][y1 - 1]), pre[n][x1 - 1][y2]), pre[n][x1 - 1][y1 - 1]);
}; for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++)
for (int h = 0; h <= n; h++)
pre[i][j][h] = f[i][j][h] = 0; f[0][1][1] = 1; for (int i = 1; i <= n; i++) {
for (int k = 0; k <= i + 1; k++) {
for (int a = 1; a <= i; a++) {
for (int b = 1; b <= i; b++) {
pre[k][a][b] = add(pre[k][a][b - 1], f[k][a][b]);
}
}
for (int b = 1; b <= i; b++) {
for (int a = 1; a <= i; a++) {
pre[k][a][b] = add(pre[k][a][b], pre[k][a - 1][b]);
}
}
}
for (int k = 0; k <= i + 1; k++) {
for (int a = 1; a <= i + 1; a++) {
for (int b = 1; b <= i + 1; b++) {
f[k][a][b] = add(
add(sum(k - 1, 1, 1, a - 1, b - 1), sum(k - 1, a, b, i, i)),
add(sum(k, 1, b, a - 1, i), sum(k, a, 1, i, b - 1))
);
}
}
}
}
std::cout << sum(m, 1, 1, n, n) << "\n";
}

AtCoder Beginner Contest 282 G - Similar Permutation的更多相关文章

  1. AtCoder Beginner Contest 260 G // imos(累积和算法)

    题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...

  2. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  3. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  4. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  5. AtCoder Beginner Contest 075 C bridge【图论求桥】

    AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...

  6. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  7. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  8. 题解 AtCoder Beginner Contest 168

    小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...

  9. AtCoder Beginner Contest 223

    AtCoder Beginner Contest 223 A是纯纯的水题,就不说了 B - String Shifting 思路分析 我真的sb,一开始想了好久是不是和全排列有关,然后读了好几遍题目也 ...

  10. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解

    KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...

随机推荐

  1. reportportal 集成 robotframework 自动化执行及结果可视化

    前言: 最近领导想了个需求,想把目前组内在linux平台上执行的自动化脚本搞成可视化,如果是web站点相关日志可视化倒是简单了,ELK就是不错的选择,大部分可视化项目这种的,可以做的开起来很炫. 我们 ...

  2. 动词时态=>3.现在时态和过去时态构成详解

    现在时态构成详解 一般现在时态 最容易构成的时态,直接加动词原形(字典当中显示的词条)就可以 第三人称"单数"的话需要加s 这是最容易出错的时态:容易将 现在的时间,和一般的状态: ...

  3. 如何规范App广告的隐私获取,让用户拥有更多知情权?

    随着互联网的不断普及,越来越多老百姓使用智能设备触达互联网.但用户经常发现自己无意间提到的东西,打开App就收到相关产品的广告推送,甚至有人怀疑手机App是通过麦克风来窃取自己平时聊天信息中的关键词进 ...

  4. HDFS追加数据报错解决办法

    主要的两个错误,今天晚上一直轮着报: 第一个 2022-10-25 21:37:11,901 WARN hdfs.DataStreamer: DataStreamer Exception java.i ...

  5. centos 7.6镜像_Centos7 配置本地yum源为iso镜像

    创建挂载路径 sudo mkdir /media/iso 挂载ISO镜像到目录 sudo mount -o loop CentOS-7-x86_64-Minimal-1810.iso /media/i ...

  6. ahk_more

    ;20:47 2022/5/8 #NoEnv #Warn #SingleInstance Force ;设工作目录为桌面 SetWorkingDir %A_Desktop% ;托盘提示必须放在热键前面 ...

  7. CentOS 8 离线安装 podman 解决方法

    CentOS 8 系统中如果没有安装Podman的话,想要离线安装会比较麻烦,因为podman依赖的包比较多,从网上一个一个下载会很繁琐,也容易出错. 这里介绍一种曲线救国的方式来离线安装. 首先分享 ...

  8. SPPS完整版下载安装教程【博主亲测】

    SPSS全称Statistical Product and Service Solutions,是一款优秀的数据分析软件,旨在为用户提供专业的统计产品与服务解决方案.SPSS面向行业应用人员所设,被广 ...

  9. mindxdl--common--head_handler.go

    // Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common the commo ...

  10. Selenium4+Python3系列(七) - Iframe、Select控件、交互式弹出框、执行JS、Cookie操作

    前言 突然,想把所有之前未更新的常用Api操作.演示写出来,算是对API的一种完结吧. 下面按照Api模块来做逐一介绍. 一.iframe操作 iframe识别: 语法: driver.switch_ ...