gym102394A Artful Paintings 2019CCPC哈尔滨A

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

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
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值