首页 > 其他分享 >TheForces Round #13 (Boombastic-Forces) G. Permutation Removal

TheForces Round #13 (Boombastic-Forces) G. Permutation Removal

时间:2023-05-20 09:58:00浏览次数:39  
标签:Boombastic 13 int TheForces 区间 操作 include DP mod

感觉好久没有写过这样单独一篇题目的博客了的说

昨天上大物课的时候ztc问了我这道题,然后我口胡了下感觉还挺有趣的

不过其它题目就没啥时间看了,正巧最近在练DP专题,就顺手记录一下吧

这题的数据范围和问题一眼区间DP的形式,直接设\(f_{l,r}\)表示区间\([l,r]\)的答案

刚开始naive地认为直接枚举一对相邻的满足要求的位置,但发现这样可能会分出长度为奇数的区间,而且对于操作的顺序也很难处理

因此后面转换了思路,考虑区间\([l,r]\)要全删完的话,\(a_l\)总会有一个与之对应的\(a_i\),因此我们可以枚举和\(l\)匹配删除的位置\(i\),则有转移:

\[f_{l,r}=\sum_{i=l+1}^r [a_l>a_k]\times f_{l+1,i-1}\times f_{i+1,r}\times coef(l,i,r) \]

这个式子前面的部分都很好理解,但就是引入的\(coef(l,i,r)\)需要一些分析

考虑此时整个序列的删除操作被分为了三类,一类是\([l+1,i-1]\)这段区间的,记为\(A\),另一类是\([i+1,r]\)这段区间的,记为\(B\),剩下的就是这次枚举的操作\((a_l,a_i)\),记为\(C\)

由于我们的DP中,\(A,B\)得到的结果已经包含了顺序,因此现在要做的就是在合法的前提下求出组合这三种删除操作的顺序

不难发现\(C\)操作必须放在所有的\(A\)操作最后,然后\(B\)操作要在保留它们之间原来的顺序的前提下,放入\(A,C\)操作序列的中间

(刚开始没想到\(B\)带序以为就是个\(a^b\)型的转移系数,后面发现不对劲)

考虑求出\(A,C\)操作序列中间(包括两端)可以插入的空隙数目,不难发现其实转移系数就是把\(B\)序列分成若干份,每一份可以为\(0\)的问题,直接上插板法就行

手玩一下转移系数就是:

\[coef(l,i,r)=C_{\frac{i-l+1}{2}+\frac{r-i}{2}}^{\frac{(r-l)}{2}} \]

然后就做完了,总复杂度\(O(n^3)\)

#include<cstdio>
#include<iostream>
#include<cstring>
#define RI register int
#define CI const int&
using namespace std;
const int N=505,mod=1e9+7;
int n,a[N],f[N][N],C[N][N];
inline int DP(CI l,CI r)
{
	if (l>r) return 1; if (~f[l][r]) return f[l][r]; int ret=0;
	for (RI i=l+1;i<=r;++i) if ((i-l+1)%2==0&&a[l]>a[i])
	(ret+=1LL*DP(l+1,i-1)*DP(i+1,r)%mod*C[(i-l+1)/2+(r-i)/2][(r-i)/2]%mod)%=mod;
	return f[l][r]=ret;
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	RI i,j; for (scanf("%d",&n),i=1;i<=n;++i) scanf("%d",&a[i]);
	for (C[0][0]=i=1;i<=n;++i) for (C[i][0]=j=1;j<=i;++j)
	C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
	return memset(f,-1,sizeof(f)),printf("%d",DP(1,n)),0;
}

标签:Boombastic,13,int,TheForces,区间,操作,include,DP,mod
From: https://www.cnblogs.com/cjjsb/p/17416793.html

相关文章

  • LeetCode 113. 路径总和 II
    题目链接:LeetCode113.路径总和II题意:给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。解题思路:与LeetCode112.路径总和相似,在遍历过程中,记录遍历过的每一个点即可。递归法递归代码:varres[][]intva......
  • AtCoder Regular Contest 133 E Cyclic Medians
    洛谷传送门AtCoder传送门其实是套路题,但是为什么做不出来啊第一步就是经典套路。枚举\(k\),统计中位数\(>k\)的方案数,加起来就是中位数的总和。那么现在\(x_{1\simn},y_{1\simm}\)就变成了\(0/1\)序列,考虑一次操作,如果\((x,y)=(0,0)\),那么\(a\)会变成\(0\)......
  • LeetCode 513. 找树左下角的值
    题目链接:LeetCode513.找树左下角的值题意:给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。解题思路:首先明确本题是要找最底层的最左边的节点,因此迭代法,可以采用层次遍历,res每次记录每一层的最左边的节点,当遍历结束时,res表示的就是最底层,最左边的节......
  • 1381B
    Unmerge题目出处Problem-B-Codeforces题目大意给定整数\(n\)和一个长度为\(2n\)的一个排列(\(1\sim2n\)都只出现一次),问是否存在两个长度为\(n\)的序列经过一次归并后可以成为给定的\(2n\)长度的排列。(注意:序列可以是无序的)知识点、思路DP、背包问题具体想法......
  • macOS Big Sur 11.7.7 (20G1345) 正式版 ISO、PKG、DMG、IPSW 下载
    本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。2023年5月18日(北京时间19日凌晨),Apple为那些无法更新macOSVentura的旧Mac发布了macOSBig......
  • Phy13. Go for the mess
    总结一下这段时间涌现出的一些想法,欢迎大家私戳我和我讨论(微信i-m-eden或qq:284914869,我想我被盒的概率应该不大吧)。之前偶然听到“goforthemess”这句话,一瞬间觉得非常有道理。它是stevenWeinberg写给刚进入科研的人的建议。由这句话可以延伸出许多问题。一个好的理论......
  • i7 13700f和i7 13700kf区别 i713700f和i713700kf参数对比
    酷睿i7-13700F采用intel7制程工艺性能核+能效核的高性能混合构架,拥有16核24线程,包括8个性能核心以及8个能效核心,最高睿频可达5.2GHz,同时配备24MBL2缓存以及36MBL3缓存,原生支持DDR5-5600、5200高频内存,无内置核显,需搭配独立显卡使用组装电脑选i713700f还是i713700kf怎么搭配......
  • macOS系统2023最佳清理软件CleanMyMac X 4.13功能介绍及如何激活解锁许可证
    CleanMyMacX4.13在软件功能列表中为MAC用户提供了常见的清理(系统垃圾、邮件附件、废纸篓)功能,还有保护(移除恶意软件、隐私)、速度(优化、维护)、应用程序(卸载器、更新程序、扩展)、文件(空间透镜、大型和旧文件、碎纸机)等功能。操作界面极其易用,例如仅需要点击几下就可以完成MAC系统的......
  • leetcode-1013-easy
    PartitionArrayIntoThreePartsWithEqualSumGivenanarrayofintegersarr,returntrueifwecanpartitionthearrayintothreenon-emptypartswithequalsums.Formally,wecanpartitionthearrayifwecanfindindexesi+1<jwith(arr[0]+......
  • P1344 [USACO4.4] 追查坏牛奶 Pollutant Control (网络流)
    P1344[USACO4.4]追查坏牛奶PollutantControl(网络流)题目链接目录P1344[USACO4.4]追查坏牛奶PollutantControl(网络流)题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示题目大意思路分析code双倍经验思路code后记不会网络流的可以看这个题目描述你第一天接......