差分约束

引入:

差分约束是来解决以下这一类问题:

给出多个 \(x_i\le x_j +c\) 的限制,求一组 \(x\) 的合法方案

那么我们就可以从 \(j\)\(i\) 连出一条边长为 \(c\)有向边

跑一次最短路,就能得到最小的合法方案

如果出现负环,则是无解

代码


进阶:

题意:

\(n\le 1e5\) 个整型变量,\(m\le 1e5\) 个限制,要求两种之一:

  1. \([l,r]\) 按位或 \(x\)

  2. \([l,r]\) 按位与 \(x\)

求出任意一种方案,保证有解

思路:

遇到位运算,可以考虑拆位贡献

那么限制就转化为:

  1. 区间 \([l,r]\) 这一位上全为 0;有一位为 1

  2. 区间 \([l,r]\) 这一位上全为 1;有一位为 0

记录序列的 0/1 前缀和,转化为左右端点的差分约束关系,求最短路即可

练习题:

P2294 [HNOI2005]狡猾的商人

SP116 INTERVAL - Intervals(注意隐含条件,可用最长路)


例题:

P2474 [SCOI2008]天平

开始还想跑出每个砝码可能的取值,但发现无论是选出发点,还是如何确定范围,都有一些麻烦

我们用 \(Mx[i][j]\) 表示 \(i\)\(j\) 之间可能的最大差值,\(Mn[i][j]\) 表示 \(i\)\(j\) 之间可能的最小差值

有如下初始化:

  1. \(i+j\)\(Mx[i][j]=2,~Mn[i][j]=1\)

  2. \(i-j\)\(Mx[i][j]=-1,~Mn[i][j]=-2\)

  3. \(i=j\)\(Mx[i][j]=0,~Mn[i][j]=0\)

  4. \(i~?~j\)\(Mx[i][j]=2,~Mn[i][j]=-2\)

然后我们用 floyd 对 \(Mx\) 跑最短路,对 \(Mn\) 跑最长路

然后就可以进行判断:

  1. \[A+B>C+D \]

\(Mn[A][C]>Mx[D][B]~||~Mn[A][D]>Mx[C][B]\)

  1. \[A+B<C+D \]

\(Mx[A][C]<Mn[D][B]~||~Mx[A][D]<Mn[C][B]\)

  1. \[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]倍杀测量者

问题可以转化为:

\[A\ge (K-T)B~/~ (k+T)A>B \]

要使这个式子无解的最大 \(T\)

考虑取对数,得到:

\[\log_2A - \log_2(K-T)\ge \log_2B~/~ \log_2(k+T)+log_2A>log_2B \]

然后正常建边即可

对于一开始就知道分数的,我们将它与 \(0\) 号结点连边

最后将 \([0,n]\) 与超级源点连边后,二分 \(T\)

如果当 \(T=0\) 式子仍有解,那么就无人一定女装(悲

代码

posted @ 2022-09-22 09:48  zuytong  阅读(14)  评论(0编辑  收藏  举报