并查集 + 二分图染色.
把每个物品的进出时间看成一条线段,则被分在同一个栈中的两条线段不能相交,只能包含或相离.
把相交的物品之间连上边,方案数就等价于合法的二分图染色方案数.
若直接连边,边数是 $O(n^2)$ 的,考虑优化建图.
将所有点按照左端点从小到大排序,按照右端点从小到大依次考虑.
它能连的点应当是左端点在区间 $[1,l)$ 内,且还没有被考虑过的所有点.
注意到若两个点分别向 $[a,b],[c,d]$ 连边,且有 $a<c<b<d$ ,那么连边时可以将 $[c,d]$ 直接换成 $[b,d]$ .
因为 $[a,b],[c,d]$ 里面的点一定都是同色的,连 $[a,b]$ 时已经保证了 $[c,b]$ 内同色,只需要对 $[b,d]$ 连边即可.
用一个并查集维护每个点通过同色的点向右最大能拓展到的位置,直接从那个点开始连边即可.
时间复杂度 $O(n\log n)$ .
1 | //%std |