GP of Southeastern Europe 2021 & SEERC2021

GP of Southeastern Europe 2021

D. LIS Counting

给定 n,m,以及模数 p。考虑所有满足 LIS=n,LDS=m 的排列,定义 f(pos,val) 表示满足 ppos=val 的排列个数。

你需要对于 1pos,valnm 均求出答案。

1nm100,108p109p 为质数。

Solution

考虑一个排列 p,记二元组 (inci,deci) 表示前缀 i 的 LIS 和 LDS,我们放置两个杨表 A,B,在 Ainci,deci 位置插 iBinci,deci 位置插 pi,最终形成的杨表必定是 n×m 的。

容易发现这是双射,即我们固定一组 A,B,一定能得到 pp 满足要求。

我们观察 A,B 杨表的性质。对于 A 而言,有行列均递增;对于 B 而言,有行递减,列递增。因此 A,B 杨表本质相同,下面我们只考虑计数 A

我们记 A 的第 i 行长度为 ai,显然有 ma1a2 am0,于是 (a1,a2,,am) 这个 m 元组有 (n+mm) 种可能,我们可以爆搜得到杨表的所有形态。

接下来,我们用 dp[i][state] 表示在杨表里放了 1i,当前杨表的形态是 state 的方案数,转移是平凡的。

考虑答案怎么求,对于 f(pos,val) 而言,答案是 i,jcoefA[i][j][pos]×coefB[i][j][val],其中 coef 数组表示有多少个杨表的 (i,j) 位置等于 pos,该数组是好求的。

总时间复杂度 O((n+mn)m2+(nm)3),在 n=12,m=8 的时候最卡。

评测记录,这题超级没有素质,连个过的代码都没有。。

I. Colourful Permutation Sorting

给定排列 p1,p2,,pn,每个位置有一个颜色 ci,一共有 k 种颜色。

现在,你可以做任意多次以下两种操作:

  • 花费 S 的代价,交换任意两个数;
  • 花费 costi 的代价,随便排列颜色 =i 的位置的数。

你需要用最小的代价使得排列满足 pi=i,求代价。

1n105,1k5

Solution

首先,我们抽象这个问题:

n 个盒子,第 i 个盒子编号为 i。有 n 个球,第 i 个球编号为 i

初始第 i 个盒子里放着第 pi 个球。

  • 1 操作:交换第 i 个盒子里的球和第 j 个盒子里的球;
  • 2 操作:随便交换颜色 =i 的盒子。

容易发现 1 操作和 2 操作是独立的,因此我们可以先执行 1 操作,最后再执行 2 操作,并且每种颜色至多进行一次操作 2

于是我们 O(2k) 枚举哪些颜色进行了操作 2,给每个选的颜色开一个点,答案就是 选的颜色代价和 + S×(n),我们目标是最大化环数。问题转化为一张 5 个点的有向图最多能分解成几个环。

我们不妨先去除自环和二元环,因为如果 ij,ji 不在一个环里,我们调整它们所在的两个环,答案不劣。

假如图只有 4 个点,那么由抽屉原理知,总出度 (42),因此必定存在一个点出度为 1,即经过这个点的环必定走这条出边,因此我们直接把该点和出边缩起来,问题降到 3 个点的子问题。

现在图有 5 个点,可能会出现一个点的出度 =2,此时它的入度至多为 2(因为入度 + 出度 + 1 5),由于总边数是 O(n) 量级的,我们暴力枚举其中一条出边的访问情况,问题又转化为 4 个点的子问题。

时间复杂度 O(2k(n+poly(k)))

M. Many LCS

构造两个 01 串 S,T,满足它们的公共子序列数 =K

1K109,你需要满足 1|S|,|T|8848

时间限制 4000ms,空间限制 256MB

Solution

一种很新颖的 idea(感谢 @YLWang 的指导):

我们构造 S=00..0_ 01 00..0_ 0100..0_ 01,其中有 m 段,第 i 段的 00..0 个数为 aiT=01 01 01,其中有 n+m01。满足 ain

我们要让它们的 LIS 做到 n+2m,即 S 中的 01 均取,然后每段中取 0biai0,满足 bi=n。显然,对于不同的 b 取法,对应不同的最长 LIS。

对于合法的 b 序列计数,我们可以考虑容斥哪些 bi>ai 来计算。但为了方便,我们不妨假设 ai>n2,这样就不存在至少两个 bi 爆限制的情况,方案数就简化为:

ways=(n+m1m1)i=1m(nai1+m1m1)

当我们取 m=4 的时候,这里的五个组合数基本上可以遍历 0109 的所有数。因此我们找到最小的 n 满足 (n+m1m1)k,然后用 01 背包找出 a1a4 即可。如果当前 n 不满足,我们试试看 n+1,依次类推,这里的移动次数极少。

但是存在一个问题:我们需要满足 ai>n2,当 k 较小时 n 也较小,可能导致构造不出解。

幸运的是,当 k 较小的时候,我们取 m=2,构造 S=00..0_ 01 00..0_ 01T=01 0101S 中每段 0 的个数为 k1T 中的 01 的个数为 k+1 即可。

posted @   wlzhouzhuan  阅读(556)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示