题面
小马给出长度为 \(n\) 的正整数序列 \(f,g\),现以如下方式生成 \(n\) 个点的有向图:
for i from 1 to n:
for j from i+1 to n:
if f[i] < f[j] and g[i] < g[j]:
add edge from i to j
else:
add edge from j to i
试求出图中三元环的个数。
数据范围:\(n\le 2\times 10^5\)
题解
对于求竞赛图的三元环个数,是有一个性质:
\[ans=\binom{n}{3}-\sum_{i=1}^n\binom{d_i}{2} \]因为你选取图中的任意三个点 \(x,y,z\),他们一定两两有边,那么若 \((x,y,z)\) 没有形成三元环的话,就有一个点的入度是 \(2\) 。
所以现在的问题就是对每个 \(i\) 求出其 \(d_i\) 了。
那么之后就是求两次三维偏序了。
同类题
P4249 [WC2007] 剪刀石头布,之前一直没去做
题意是你给竞赛图定向,最后让三元环数最多。
首先是可以考虑将边先贡献到点上,然后在点这里计算贡献。
根据上面的公式,我们知道一个点第一次被产生贡献是 0,第二次就是 1,以此类推。
那么我们就可以用费用流来处理(感觉费用流的题还是比较少,所以还是需要注意注意)。
建图:
-
由源点 \(S\) 向每一条边对应的点连边,容量为 \(1\),费用为 \(0\)
-
由每一条边对应的点向该边连接的两个图上结点连边,容量为 \(1\),费用为 \(0\) 。
-
由每一个图上结点向汇点 \(T\) 连若干条边,费用依次为 \(0,1,2,3,...,n-1\) (分别表示该点入度从 \(0\) 开始每增加
\(1\) 就会失去的三元环数量),容量均为 \(1\) 。
启发
- 就是竞赛图三元环个数的计算trick
- 后面的费用流做法也可以注意一下。
- 注意费用流的复杂度是 \(O(nmf)\) 的(\(f\) 是流量大小)