首页 > 其他分享 >南外集训 2024.2.15 T3

南外集训 2024.2.15 T3

时间:2024-02-15 18:33:32浏览次数:29  
标签:2024.2 le 15 外向 位置 选择 南外 关键 节点

题目描述还能有错的?

\(T\) 组询问,每次给定 \(n, k\),问:如果一个 \(2n\) 个数的排列所有偶数位置构成的子序列是单调递增的,那么说这个排列是好的。将一个好的排列按照顺序拆分成若干组,每一组个数都是偶数,形成的结构叫做一个城市。一个城市的价值是每个组内部的逆序对个数的乘积。求从所有城市中随机选取一个,它的代价的数学期望。

你实际上需要输出答案乘以 \(\binom{n-1}{k-1}\),这是因为 std 和原题题意中有一个写错了。

\(1\le T\le 10^4, 1\le k\le n\le 500\)

注意到城市的代价可以这样描述:从每个组内选择一个逆序对,这样选择的方案数。所以我们可以转而计算对于所有选择 \(k\) 对元素的方法,允许这样选择的城市个数之和。选择的逆序对有两种情况:两个奇数位置或一个奇数一个偶数。我们将所有偶数位置,以及后一种情况涉及到的奇数位置叫做关键位置。显然我们只需选择一些标号分配给关键位置,乘上关键位置的合法排列方案数,再随意排列非关键位置即可。对于前一种逆序对,显然它会在随意排列非关键位置的过程中贡献 \(\frac{1}{2}\) 的系数,直接在 DP 时乘上即可。现在我们关心这样一个问题的做法:

给定一条长度为 \(n\) 的单向链,每个元素旁边可能啥也不挂,可能挂一个指向它的元素,可能挂一个被它指向的元素,这样形成了一个非常特殊的有向无环图,求它的拓扑序个数。

我们可以在访问到内向节点的时候,直接在前面任意选择一个空位插入这个节点;在访问到外向节点时,把这个节点拿在手里;每次访问完一个节点,都可以任意选择手里的一些节点,按照任意顺序把它们放在当前节点后面。从而我们只需要在 DP 状态里记录目前总共放下了多少个节点,以及手里拿着多少外向节点没放下。

这样立刻得到原题的一种 DP 做法:\(f_{i,j,t,l,S}\) 表示前 \(2i\) 个元素,分了 \(j\) 组,当前总共放下了 \(t\) 个关键节点,还有 \(l\) 个外向的关键节点没有放下,且当前组内选择关键节点位置的状态是 \(S\)(\(S = \Theta(1)\)),此时的方案数。这个 DP 可以预处理,答案就是:

\[\frac{\sum_{t=n}^{n+k}\binom{2n}{t}(2n-t)!\cdot f_{n,k,t,0,\mathtt{ok}}}{\binom{n-1}{k-1}\binom{2n}{n}n!} \]

其中 \(S = \mathtt{ok}\) 表示在当前组内已经选择了全部的两个关键位置。转移是平凡的。这个做法时间复杂度是 \(\Theta(n^4)\)。

注意到我们只是为了处理外向节点加入了一维信息。现在使用容斥处理:加入一个外向节点时,按照这个节点不算入关键节点进行一次转移,然后按照这个节点是内向关键节点进行一次系数为 \(-1\) 的转移。复杂度立刻变成 \(\Theta(n^3)\)。大力卡常可以通过。

标签:2024.2,le,15,外向,位置,选择,南外,关键,节点
From: https://www.cnblogs.com/kyeecccccc/p/18016464

相关文章

  • Delete a node from bst【2月15日学习笔记】
    点击查看代码//Deleteanodefrombst#include<iostream>structnode{intdata;node*left;node*right;};node*getnewnode(intx){node*temp=newnode;temp->data=x;temp->left=temp->right=NULL;returntem......
  • 2.15随笔
    今天学习到了一个关于dp的小技巧,我就叫它“加维”了。当发现无论怎么列状态转移方程,都会存在变量时,就可以尝试加维,扩展一个变量的更新。例如bicycles这道题,它相比其他的图论多了一个可以更换自行车,导致无论怎么写传统的dij都无法更新自行车的变更,因此我们就可以加维,来能够更新自......
  • 20240215打卡
    使用MPAndroidChart第三方框架绘制柱状图:1.**在build.gradle文件中添加依赖项**(低版本可以导入jar包):打开您的项目的build.gradle文件,然后在dependencies部分添加MPAndroidChart的依赖项。```groovydependencies{implementation'com.github.PhilJay:MPAndroidCh......
  • 2023.2.15 LGJ Round
    A\(n\)个点,有\(m\)种操作\((w,l,r)\),代表贡献是\(w\),并消除\([l,r]\)的所有点。操作的条件是必须消除一个点,问最多的贡献是多少。\(n,m\le300\).考虑从小区间开始操作,不难联想到区间dp。\(dp_{i,j}\)代表\([l,r]\)都被消除的最大贡献。对于\(dp_{i,j}\),我们枚举......
  • 2024.2.14 WC24 线段树 / CF1572D / lgP3679
    西安Day1。感冒还没好,牙龈炎也没好,明天还要考试,又要坐牢了/kk。今天是tyy的图论选讲,感觉前面网络流部分还是在线的,平面图部分毒瘤tyy拿出了他的员交课件,恐怖,直接下线了。看了NAVI和Faze的预选赛,你们俩怎么都打的这么稀碎/fn。Override真好听。「WC2024」线段树我......
  • 2024.2
    1.gym103260HExcludedMin先思考怎么转化原问题,如何check\(F(S)\geqx\)呢。如果\(S\)中\(<x\)的数\(\geqx\),显然就合法了;否则的话,我们操作过程肯定会出现一个\(x\),而根据题目的过程,出现一个\(x\)后\(x\)就不会消失了,所以说相当于是check\(F(S)\geqx+1\)了......
  • 2024.2.14 LGJ Round
    A一棵树,\(q\)次询问,每次给定\(x,d_x,y,d_y\),你需要找到一个\(u\)使得\(dis(u,x)=d_x,dis(v,x)=d_y\)。\(n,q\le1e6\)。稍微转化为对于点\(k\),找到一个距离为\(d\)的点,使得不走\(x,y\)这边子树。只需要求出每个点距离最远的几个点,且位于不同子树。因为要是存在距离......
  • 2024.2.13 LGJ Round
    A一个圆上有\(2n\)个点,你需要选出\(n\)个点对连一条线段,其中一些点对已经被选。问所有点对方案中,联通块个数的和,联通的含义是线段相交,那么两条线段的端点都互相可达。\(n\le300\)。线段相交,把圆放到序列上就是区间相交然而不包含。我们拆贡献,计算每个区间\([l,r]\)的......
  • #13 2024.2.14
    有人情人节恋爱。有人情人节看海。有人情人节打模拟赛。583.loj3709「ZJOI2022」面条这个题过于神秘了。首先假设\(n\)是奇数,不然预处理log轮就好了。然后会变成xxyyzz...uuvvw的形状,并且不会变。特别神秘的是,注意到把y-x,z-y,...,v-u,w-v写成序列,那么新的差分......
  • P1152 欢乐的跳
    1.题目介绍欢乐的跳题目描述一个\(n\)个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了\([1,n-1]\)之间的所有整数,则称之符合“欢乐的跳”,如数组\(\{1,4,2,3\}\)符合“欢乐的跳”,因为差的绝对值分别为:\(3,2,1\)。给定一个数组,你的任务是判断该数组是否符合“......