ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ACL Beginner Contest F(Heights and Pairs)题解——分治NTT

2021-01-02 09:59:45  阅读:168  来源: 互联网

标签:Pairs 匹配 log Beginner vi NTT dpi 题解 dp


Description

一个序列有 2 n 2n 2n个数,现在你要在这个序列中配得 n n n个无序数对,使得每一对的两个数不同且每个数都在恰好 1 1 1个对中。

请求出合法配对的方案数。注意 ( 1 , 3 ) ( 2 , 4 ) (1,3)(2,4) (1,3)(2,4)与 ( 2 , 4 ) ( 1 , 3 ) (2,4)(1,3) (2,4)(1,3)这两种配对方式是等价的。

请将答案对 998244353 998244353 998244353取模

n ≤ 50000 , a i ≤ 1 0 5 n≤50000,a_i≤10^5 n≤50000,ai​≤105

Solution

考虑 d p dp dp。

如果按照整个序列去进行 d p dp dp的话很难设计出合理的状态,所以考虑开桶 d p dp dp,并令 v i v_i vi​表示第 i i i个桶的大小。根据题意,每一个桶中的数不能进行匹配,不难得到状态设计与状态转移:

d p i , j dp_{i,j} dpi,j​表示看到第 i i i个桶(即已经处理了 1 1 1至 i i i号桶),还剩 j j j个未匹配的方案数

状态转移如下:
d p i , j = ∑ k = 0 v i   C v i k   A j − ( v i − k ) + k k   d p i − 1 , j − ( v i − k ) + k dp_{i,j}=\sum_{k=0}^{v_i}\ C_{v_i}^k\ A_{j-(v_i-k)+k}^k\ dp_{i-1,j-(v_i-k)+k} dpi,j​=∑k=0vi​​ Cvi​k​ Aj−(vi​−k)+kk​ dpi−1,j−(vi​−k)+k​

解释一下这个状态转移。 k k k枚举的是在 i i i这个桶内与前面匹配掉的数的数量。 C v i k C_{v_i}^k Cvi​k​表示在第 i i i个桶中选择 k k k个与前面进行匹配。由于看到第 i i i个桶还剩 j j j个数未匹配,第 i i i个桶本身对“未匹配的量”的贡献是 v i − k v_i-k vi​−k,并且前面还要多留 k k k个数与第 i i i个桶选中的数进行匹配,所以之前未匹配的数的数量应该是 j − ( v i − k ) + k j-(v_i-k)+k j−(vi​−k)+k。在这个里面选 k k k个数与第 i i i个桶中选定的 k k k进行匹配的方案数为 A j − ( v i − k ) + k k A_{j-(v_i-k)+k}^k Aj−(vi​−k)+kk​。

每次暴力转移的时间复杂度是 O ( n 3 ) O(n^3) O(n3)的,严重超时。我们先尝试将它优化到 O ( n 2 ) O(n^2) O(n2)或类 O ( n 2 ) O(n^2) O(n2)。

我们拆开状态转移式中的括号并观察:

d p i , j = ∑ k = 0 v i   C v i k   A j − ( v i − k ) + k   d p i − 1 , j − ( v i − k ) + k dp_{i,j}=\sum_{k=0}^{v_i}\ C_{v_i}^k\ A_{j-(v_i-k)+k}\ dp_{i-1,j-(v_i-k)+k} dpi,j​=∑k=0vi​​ Cvi​k​ Aj−(vi​−k)+k​ dpi−1,j−(vi​−k)+k​

d p i , j = ∑ k = 0 v i   C v i k   A j − v i + 2 k   d p i − 1 , j − v i + 2 k dp_{i,j}=\sum_{k=0}^{v_i}\ C_{v_i}^k\ A_{j-v_i+2k}\ dp_{i-1,j-v_i+2k} dpi,j​=∑k=0vi​​ Cvi​k​ Aj−vi​+2k​ dpi−1,j−vi​+2k​

考虑将 d p i − 1 dp_{i-1} dpi−1​翻转,就得到了一个卷积的形式。每次跑一遍 N T T NTT NTT,时间复杂度优化到 O ( n 2 log ⁡ n ) O(n^2 \log n) O(n2logn)。

但是我们依然不满意。不难发现这个状态转移可以用cdq分治来优化,即分治NTT。每次我们递归左半边,跑一遍NTT处理左半边对右半边的贡献再往后边递归。由于递归的深度最大是 log ⁡ n \log n logn的,所以卷积的次数为 n log ⁡ n n \log n nlogn次,总时间复杂度为 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n)。

NTT txdy!

Summary

在本题中,我们巧妙设计了 d p dp dp状态,发现翻转后是一个卷积的形式,从而采用分治NTT将时间复杂度优化到了 O ( n 2 log ⁡ n ) O(n^2 \log n) O(n2logn)。

可以说这是一道比较套路的题,唯一较为灵活的就是 d p dp dp的状态设计以及状态转移。分治NTT出来得比较自然,可惜蒟蒻(我)在想这题的时候并不会分治NTT,是在看了别人的题解之后才悟懂。

感觉这题放在ABC的F题是不是太过分了啊???

标签:Pairs,匹配,log,Beginner,vi,NTT,dpi,题解,dp
来源: https://blog.csdn.net/Cherrt/article/details/112093433

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有