[AGC036F] Square Constraints

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

每个数能取的范围是一段区间 [li,ri],其中 li 单调不增, ri 单调不增。

画个图 (n=10):

圆环和矩形的交即为合法点。

容易看出 lnl2n1 都是 0。

本质上是元素有上下界的排列计数,考虑不管下界只看上界然后容斥。

假设每个元素只有上界 Ri,那么将 R 排序(记为 R),方案数就是 i=1Rii+1。比较好理解,每个位置能选的数的个数就是原本能选的个数减去前面已选的个数(由于有序,已选的个数就是 i1,可以发现减去的数就是排名-1)。

接下来容斥,记 fi[0,n) 中恰好有 i 个的上界取 li1,其余上界取 ri 的总方案数。易得 ans=i=0n(1)ifi

考虑求 fi

由于每个未知的贡献与其排名有关,不妨将序列大致排序后与过程中进行微调。

[0,n) 部分以 li1 为关键字,[n,2n)ri 为关键字排序,从前往后进行 dp。设 dp[i][j] 为考虑了(排序后的)前 i 个位置,已经有 j[0,n) 内的位置的上界取了 l1

分类讨论:

  • 当前点属于 [n,2n)

这个点原本有 ri+1 种选法。 i 之前所有 [0,n) 中且上界取了 l 的位置都会使 i 排名 +1;还有 i 之前所有 [n,2n) 的位置,由于排序,这些位置也会使 i 排名 +1。

发现第二类位置的个数(记为 c1)对于每个 i 是确定的,可以在 dp 过程中顺便记录。

于是这个位置的选法就是 ri+1jc1

于是 dp[i+1][j]+=dp[i][j]×(ri+1jc1)

  • 当前点属于 [0,n)

又有两种情况:

上界取 li1

选法是 lijc1。原因类似上面。

于是 dp[i+1][j+1]+=dp[i][j]×(lijc1)

上界取 ri:

复杂的情况。

原本有 ri+1 种选法。

由图可得 [n,2n) 所有的 r 都得排在 ri 前面,于是排名增加 n

最终 [0,n) 内且上界取了 l1 的所有位置都排在 ri 前面,但是我们不知道有多少个。那么我们就设最后有 k 个,那么排名增加 k

又由图可知,i 之前 [0,n) 内且上界取了 r 的所有位置也得排在 ri 前。与 c1 类似,记录 c2i 之前在 [0,n) 之间的个数,那么这部分排名增加 c2j

于是 dp[i+1][j]+=dp[i][j]×(ri+1nkc2+j)

但是由于 k 不知道,我们可以枚举 k 是多少,对每个 k 进行一次 dp。最后有 fk=dp[2n][k]

posted @   jimmyywang  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示