给定一个长度为$n$的序列以及$k$个条件,每个条件要求序列当中一个点的权值大于/小于/不大于/不小于/等于另一个点。求这个序列总和的最小值
$1 \le k,n \le 100000$
感谢@oy 的贡献
差分约束系统的模板题。
记 $d$ 数组为以 $S$ 为源点到各个节点的最长路。根据最长路的性质,如果存在一条边 $(u,v,w)$ ,则一定满足以下不等式:
$$
d[u]+w(u,v)\le d[v]
$$
我们可以将题目中给出的不等关系转化为图中的有向边,然后通过单源最长路求出的一组 $\lbrace d_n\rbrace$ 即为差分约束系统的一组解。
因此,在图中连一条边 $(u,v,w)$ 相当于对 $d[u]$ 和 $d[v]$ 的取值作出限制,我们只需在构造出一张有向图,并求出其单源最长路即为答案。
有向边的构造方式如下:
- 限制 $d[A]=d[B]$
$$
d[A]=d[B] \Leftrightarrow (d[B]\le d[A])\wedge(d[A]\le d[B])
$$
$$
\Leftrightarrow (d[B]+0\le d[A])\wedge(d[A]+0\le d[B])
$$
连边:$(A,B,0)$,$(B,A,0)$
- 限制 $d[A]<d[B]$
$$
d[A]<d[B]\Leftrightarrow d[A]+1\le d[B]
$$
连边:$(A,B,1)$
- 限制 $d[A]\geq d[B]$
$$
d[A]\ge d[B]\Leftrightarrow d[B]+0\le d[A]
$$
连边:$(B,A,0)$
- 限制 $d[A]>d[B]$
$$
d[A]>d[B]\Leftrightarrow d[B]+1\le d[A]
$$
连边:$(B,A,1)$
- 限制 $d[A]\le d[B]$
连边:$(A,B,0)$
- 限制 $d[i]>0$
连边:$(S,i,1)$
连完所有的边后,跑一遍单源最长路;如果存在正环则输出无解。
统计答案时记得开$long$ $long$。
代码如下:
1 | #include <bits/stdc++.h> |