首页 > 其他分享 >ABC134F Permutation Oddness

ABC134F Permutation Oddness

时间:2024-03-06 12:11:25浏览次数:26  
标签:Oddness 匹配 int 对点 怪异 2j Permutation ABC134F sim

[ABC134F] Permutation Oddness

好题,牛牛的一个套路 —— \(\textsf H\)\(\textsf {anghang}\)

写起来简单,想起来难的一个东西,难点主要是在 状态设置

我们可以把 \(1 \sim N\) 拆点,于是原题相当于求一个 二分图的完美匹配,并使其 怪异度为 \(k\)

我们考虑设置 \(f_{i, j, k}\) 三个状态

分别表示 当前考虑了前 \(i\) 点,当前有 \(j\) 没有匹配上,当前怪异度为 \(k\)

显然最终答案就是 \(f_{N, 0, K}\)

这里可以发现,当前没有匹配上 其实就是 最终匹配上的点不是前 \(i\) 对点

我们顺序枚举三个状态,当每次 一个新点加入考虑++i)时,容易发现以下 三种情况

注意,下面 第三维 表示 怪异度 的值 \(x\) 均 没有实际意义,且 不代表同一个变量

可以理解成 占位符,关于 怪异度 的部分最后会讨论

  1. 新的点中 一对都都没匹配上

    显然 此时 没匹配上的对数 \(j\) 多了一个(新增一对,没有匹配)

    于是我们需要从 \(f_{i - 1, j - 1, x}\) 处转移

    我们当前只考虑前 \(i\) 对点,也就是将 当前没匹配上(实际匹配 \(i - 1 \sim N\))的均看作 一种情况

    两者都没匹配上 的可能 只有一种,这里的贡献应当是 \(f_{i - 1, j - 1, x}\)

  2. 新的点中 匹配上了一对

    显然 此时 没匹配上的对数 \(j\) 不变(新增一对,匹配一对),我们从 \(f_{i - 1, j, x}\) 处转移

    匹配的这一对 有可能是 左部点 \(L_i\) 匹配到一个 \(R_1 \sim R_{i - 1}\) 中未被匹配的右部点,共 \(j\) 个

    也可能是 右部点 \(R_i\) 匹配到一个 \(L_1 \sim L_{i - 1}\) 中未被匹配的左部点,共 \(j\) 个

    还可能是 这一对点 \((L_i, R_i)\) 互相匹配,显然一共三种情况,有 \(2j + 1\) 种可能匹配

    于是这里的贡献应当是 \((2j + 1)f_{i - 1, j, x}\)

  3. 新的点中 匹配上了两对

    显然 此时 没匹配上的对数 \(j\) 少了一个(新增一对,匹配两对),我们从 \(f_{i - 1, j + 1, x}\) 处转移

    显然 \(L_i\) 可以找 \(R_1 \sim R_i\) 中 未被匹配的点,共 \(j + 1\) 个

    同时 \(R_i\) 可以找 \(L_1 \sim L_i\) 中 未被匹配的点,共 \(j + 1\) 个

    当时想为什么这里是 \(j + 1\) 而不是 \(j\),挺唐诗的

    我们是从 前 \(i - 1\) 对点,还剩 \(j + 1\) 对未匹配的 \(f_{i - 1, j + 1, x}\) 处转移过来的

    当然有 \(j + 1\) 种选择,而 \(f_{i, j, x}\) 只是表示 当前情况,与 能选择的种数无关

    容易知道,\(L_i\) 与 \(R_i\) 的选择 互不干扰,于是最终将产生 \((j + 1) ^ 2\) 种 可能匹配

    于是这里的贡献应当是 \((j + 1) ^ 2 f_{i - 1, j + 1, x}\)

加在一起,最终的式子就是 $f_{i, j, x} = f_{i - 1, j - 1, x} + (2j - 1) f_{i - 1, j, x} + (j - 1) ^ 2 f_{i - 1, j + 1, x} $

这时我们来考虑一直忽略的 怪异度 这一维,这里提供一种和 现行题解 不完全相同的理解方式

前面部分参考题解,我们给对 对应点 \((L_i, R_i)\) 之间 连线

那么 怪异度 就是 完美匹配跨过连线条数,这里可以参考 Tan_Wei_Ye 的 这篇题解

我们一直只考虑 前 \(i\) 对点的情况,也就是不要把 线 在一开始连完

只当枚举到 \(i\) 时,才考虑 \(L_i, R_i\) 的对应的线 产生的贡献,而此时有 \(j\) 没匹配上

换言之就是 \(L_1 \sim L_i, R_1 \sim R_i\) 中 共有 \(2j\) 个点 最终 将匹配到 \(L_{i + 1} \sim L_N, R_{i + 1} \sim R_N\)

也就是有这 \(2j\) 个点 将会跨过 \(L_i, R_i\) 对应的线,于是产生 \(2j\) 的 怪异度

这时就可以 准确地描述 上面的转移了,我们每次一定增加 \(2j\) 的怪异度,最终方程如下

根据我们对 怪异度 的理解可以发现,上面的分类讨论 与 此处怪异度的贡献 并无关系

不用担心 上面分类讨论时 忽略怪异度 而对正确性造成影响

\[f_{i, j, k} = f_{i - 1, j - 1, k - 2j} + (2j + 1) f_{i - 1, j, k - 2j} + (j + 1) ^ 2 f_{i - 1, j + 1, k - 2j} \]

枚举并转移即可,具体见代码

由于我们 怪异度 在转移过程中 不会减少(不会有 \(f_{i, j, k}\) 需要用到 \(f_{x, y, z} ~~ z>k\))

故我们第三维转移只需要 终止在 需求的 \(K\) 即可,不需要转移到 理论怪异度上界 \(N ^ 2\)

#include <bits/stdc++.h>

const int MAXN = 55;
const int MOD  = 1000000007;

using namespace std;

int F[MAXN][MAXN][MAXN * MAXN];
int N, K;

int main () {
	
	cin >> N >> K, F[0][0][0] = 1;
	
	for (int i = 1; i <= N; ++ i)
		for (int j = 0; j <= i; ++ j)
			for (int k = j * 2; k <= K; ++ k)
				F[i][j][k] = (1ll * ((j << 1) + 1) * F[i - 1][j][k - (j << 1)] + 1ll * (j + 1) * (j + 1) * F[i - 1][j + 1][k - (j << 1)] + (j > 0) * F[i - 1][j - 1][k - (j << 1)]) % MOD;
	
	cout << F[N][0][K] << endl;
	
	return 0;
}

标签:Oddness,匹配,int,对点,怪异,2j,Permutation,ABC134F,sim
From: https://www.cnblogs.com/FAKUMARER/p/18056249

相关文章

  • [ARC140F] ABS Permutation (Count ver.) 题解
    洛谷题面传送门AT题面传送门发现不太好直接求,考虑将\(P\)映射到\(P^{-1}\)上,这样题目中的条件就变成了\(|P_i-P_{i+M}|=1\)。因此我们可以对模\(M\)的每个剩余系做\(M=1\)的情况,然后最后快速幂合并。考虑\(M=1\)的情况怎么做。记\(f_i\)表示\(K=i\)的方案数,......
  • Gym 104855E Perfect Permutation
    考虑最后对于每个\(i\)是选\(a_i,b_i,c_i\)之中哪一个的序列。通过观察能发现序列去掉\(b\)后满足开头为\(c\)末尾为\(a\)这个序列就是合法的,同时整个序列都为\(b\)也是合法的。首先如果是个合法序列,对于去掉\(b\)后的开头,其余不是\(b\)的下标肯定比其大,所以......
  • E. Klever Permutation
    E.KleverPermutationYouaregiventwointegers$n$and$k$($k\len$),where$k$iseven.Apermutationoflength$n$isanarrayconsistingof$n$distinctintegersfrom$1$to$n$inanyorder.Forexample,$[2,3,1,5,4]$isapermutation,but$[1,2,......
  • E. Klever Permutation
    题解假设a1a2a3...ak ak+1ak+2...an是符合要求的数组,那么我们可以推断出:a(k+1)=a(1)+1;a(k+2)=a(2)-1;...a(2k+1)=a(k+1)+1;...因此我们知晓奇数位的数要比较小,偶数的位置要比较大;又题目说明一定有解,所以我们假定a1=1,a2=n再递推出其余各项。Code#include<b......
  • CF1861E Non-Intersecting Subpermutations 题解
    简要题意一个长度为\(n\)的元素在\([1,k]\)的整数序列\(a\)的价值定义如下。初始\(i=1\),如果\(a_{i\simi+k-1}\)包含了\(1\simk\)的所有整数,则价值加\(1\),然后令\(i=i+k\)。如果没有包含\(1\simk\)的所有整数则\(i=i+1\),直到\(i\geqn-k+2\)时结束。......
  • P9663 Permutation on Tree 题解
    考虑枚举一个\(x\in[1,n)\),将\(\leqx\)的看作\(0\),\(>x\)的看作\(1\),那么一个排列的贡献实际上就是\(\sum_{x=1}^{n-1}\sum[[p_i\leqx]+[p_{i+1}>x]=1]\)。那么问题转变为一个给定一棵树,每一个点有权值\(0\)或\(1\),求所有排布方案的贡献之和。设\(f_x\)表示......
  • CF1918G Permutation of Given 题解
    总体思路本题通过每次在已知序列中加入\(2\)个元素的方法,可以构造出满足条件的序列\(A\),这里提供一种新的构造方法。性质因为序列\(A\)中所有元素构成的可重集与序列\(B\)中所有元素构成的可重集完全相等,所以\(A\)中所有元素之和与\(B\)中所有元素之和相等。\[\s......
  • 加权排列熵Weighted Permutation Entropy及多尺度系列(Matlab版)
    学者们开发了各种复杂性度量来比较时间序列并区分规则(例如,周期),混沌和随机行为。提出了加权排列熵概念,其是一个定义简单的复杂性度量,可以很容易地计算任何类型的时间序列,无论是规则的,混沌的,嘈杂的,还是基于现实的时间序列。(matlab代码获取:https://mbd.pub/o/bread/mbd-ZZmbm5pv)参......
  • P10033 「Cfz Round 3」Sum of Permutation
    原题链接基础赛唯一写了的题,因为我喜欢构造!事实上的确有点麻烦了,应该会有更好的做法。但是自我感觉这个思维很连贯,因为这就是我做题时思路的写照。记\(p_{pos1}=1,p_{posn}=n\)。首先可以构造\(a_i\getsp_i+1\)这样一定满足第二个限制,但是当\(p_i=n\)时不满足第一个限......
  • ARC167D Good Permutation 题解
    ARC167D看到排列并且有\(i\getsa_i\),就可以直接建出图来,显然是若干个不相干的环。如果不求字典序最小,就可以直接不在同一个环中的\(i,j\)直接交换就可以了,因为它要求了最小化操作数。如果求字典序最小,直接从前往后扫一遍,可以用set维护不在这个环中且\(j>i\)的最小值,如果......