https://codeforces.com/gym/102394/problem/A
这题看见区间权值和大于等于,就很显然是转成前缀和差分约束了
然而对于第二个限制条件,是dis[n]-(dis[r]-dis[l-1])>=k,而这个dis[n]我们是不知道的。
然而我们可以发现,两个条件都是>=,那么dis[n]越大,我们就越有可能满足所有的条件,所以就可以直接二分了
然后我犯了一个错误,找了好久,看一篇网上的博客他跟我建图一毛一样,结果我比对了好久,结果把他的交上去也WA了,气死
因为二分出来的mid就是dis[n],所以此时的dis[n]应该是一个定值,即需要add(0,n,mid),add(n,0,-mid)
还是那个问题,差分约束系统,一个条件都不能少。。。。
该题隐含条件还有0<=dis[i]-dis[i-1]<=1,这是前缀和的隐含性质
然后对于op1,建dis[r]-dis[l-1]>=k,add(l-1,r,k),对于op2,dis[l-1]-dis[r]>=k-mid,这每次二分后,边权需要更新下
然后就是add(0,n,mid),add(n,0,-mid)
最后我们只需要判断有没有负环就行了
>=的跑最长路的我们需要加上SLF优化
如果是<=的跑最短路的建图,由于每个i->i-1有一条权值为0的边,如果某个时刻dis[v]<0,那么一定与v-1组成一个2元负环,此时可以直接return false,不必再进队次数>=n+1的时候再判断。
给出两种建图的写法。。。前者是>=(其实一开始是怀疑因为建了>=的图错了,所以尝试了一下建<=的图。。。。
#include<bits/stdc++.h>
usin

本文详细解析了Codeforces的一道难题,通过转换为前缀和差分约束问题,并结合二分搜索技巧,解决了一个包含区间权值和与特殊限制条件的问题。文章深入探讨了差分约束系统的应用,如何处理未知的dis[n],以及通过二分找到满足所有条件的最大值。同时,提供了两种建图写法,分别针对>=和<=的路径寻找,强调了SLF优化的重要性。
最低0.47元/天 解锁文章
390





