Pro Tanto Quid Retribuam|

Schucking_Sattin

园龄:2年11个月粉丝:13关注:28

2024-02-05 10:24阅读: 40评论: 0推荐: 0

[ARC171B] Chmax

[ARC171B] Chmax

Solution

首先可以发现相同 ai 的元素可以形成一条链。

问题很容易转化为:给定若干线段 [li,ri],要求 i 能连向 j 当且仅当 lj<ri,求生成环集的数量。

容易发现两个点之间至少有一条边,当且仅当两线段不交时,左侧线段无法连向右侧线段。

感觉直接莽不舒服,转成补图就舒服多了。

超集反演。记 U 表示补图边全集,w(S) 表示生成图边集 U=S 的方案数,W(S) 表示生成图边集 US 的方案数。显然有 W(S)=STw(T)w(S)=ST(1)|T||S|W(T)。于是答案为:

w()=S(1)|S|W(S)

W(S) 可以 DP 求出。将线段按左端点排序并依次编号(以下直接称线段为点了),记 fi,j 表示考虑前 i 个点,共连了 j 条不合法边的方案数。现在考虑 fi1fi 的转移,假设当前点 i 的入度为 c,则:

fi,jfi1,jfi,j+1(cj)fi1,j

正确性在于:如果 ijk>j,则 ik

此做法其实是将原问题形式化成了该问题:给定一个非负不降整数序列 a1,,an(即入度序列),对 i=1,,n 求选取 i 个元素的带权方案数,权值定义为 j=0i1(cjj),其中 c 序列是你选取的数。这个我还不会更优复杂度。code ARC171B - O(n2)


回到第二步:|考虑给每个右端点匹配一个左端点,如果一个位置是左端点则 ++cnt,如果一个位置是右端点则 ans *= cnt, --cnt。😐 code code ARC171B - O(n)

本文作者:Schucking-Sattin

本文链接:https://www.cnblogs.com/Schucking-Sattin/p/18007485

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Schucking_Sattin  阅读(40)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起