差分约束
引入:
差分约束是来解决以下这一类问题:
给出多个 \(x_i\le x_j +c\) 的限制,求一组 \(x\) 的合法方案
那么我们就可以从 \(j\) 向 \(i\) 连出一条边长为 \(c\) 的有向边
跑一次最短路,就能得到最小的合法方案
如果出现负环,则是无解
进阶:
题意:
\(n\le 1e5\) 个整型变量,\(m\le 1e5\) 个限制,要求两种之一:
-
\([l,r]\) 按位或 \(x\)
-
\([l,r]\) 按位与 \(x\)
求出任意一种方案,保证有解
思路:
遇到位运算,可以考虑拆位贡献
那么限制就转化为:
-
区间 \([l,r]\) 这一位上全为 0;有一位为 1
-
区间 \([l,r]\) 这一位上全为 1;有一位为 0
记录序列的 0/1 前缀和,转化为左右端点的差分约束关系,求最短路即可
练习题:
SP116 INTERVAL - Intervals(注意隐含条件,可用最长路)
例题:
P2474 [SCOI2008]天平
开始还想跑出每个砝码可能的取值,但发现无论是选出发点,还是如何确定范围,都有一些麻烦
我们用 \(Mx[i][j]\) 表示 \(i\) 与 \(j\) 之间可能的最大差值,\(Mn[i][j]\) 表示 \(i\) 与 \(j\) 之间可能的最小差值
有如下初始化:
-
当 \(i+j\),\(Mx[i][j]=2,~Mn[i][j]=1\)
-
当 \(i-j\),\(Mx[i][j]=-1,~Mn[i][j]=-2\)
-
当 \(i=j\),\(Mx[i][j]=0,~Mn[i][j]=0\)
-
当 \(i~?~j\),\(Mx[i][j]=2,~Mn[i][j]=-2\)
然后我们用 floyd 对 \(Mx\) 跑最短路,对 \(Mn\) 跑最长路
然后就可以进行判断:
-
\[A+B>C+D \]
即 \(Mn[A][C]>Mx[D][B]~||~Mn[A][D]>Mx[C][B]\)
-
\[A+B<C+D \]
即 \(Mx[A][C]<Mn[D][B]~||~Mx[A][D]<Mn[C][B]\)
-
\[A+B=C+D \]
即 \(Mn[A][C]=Mx[A][C]=Mn[D][B]=Mx[D][B]~||~Mn[A][D]=Mx[A][D]=Mn[C][B]=Mx[C][B]\)
注意判断中的 或 !
P4926 [1007]倍杀测量者
问题可以转化为:
要使这个式子无解的最大 \(T\)
考虑取对数,得到:
然后正常建边即可
对于一开始就知道分数的,我们将它与 \(0\) 号结点连边
最后将 \([0,n]\) 与超级源点连边后,二分 \(T\)
如果当 \(T=0\) 式子仍有解,那么就无人一定女装(悲