题解 P4926 [1007]倍杀测量者
啊不是,这题精度也太..好过了。
这题其实挺简单的,只要想好怎么建边,跑SPFA即可。
首先题目给出以下不等式:
-
\(s_a > s_b \times (k_i -T)\)
-
$s_a \times (k_i +T) > s_b $
这一看!欸咋那么像差分约束呢。
那么第一个问题,怎么连边。
我不是很会跑乘法,所以我把它转换成 \(\log\) 跑加法。
对于第一个式子,我们可以转换成:\(\log_2(s_{a_i}) + \log_2(s_{b_i} + \log_2(k_i -t)\)
对于第二个式子,我们可以转换成:\(\log_2(s_{a_i}) > \log_2(s_{b_i}) - \log_2(k_i+t)\)
然后加边就出来了。
因为这题对精度要求很低,所以我们可以直接连。
每次记录 \(k\) 的值,然后对于 \(t\) 分类讨论。
for(int i=0;i<=n;i++)
{
add(n+1,i,0,3);
}
for(int i=1,opt,a,b;i<=s;i++)
{
cin>>opt>>a>>b>>x;
add(b,a,x,opt);
if(opt==1)
{
r=min(r,x);
}
}
for(int i=1,c;i<=t;i++)
{
c=read();
x=read();
add(0,c,log2(x),3);
add(c,0,-log2(x),3);
}
无解的话就是在 \(t=0\) 且上面那个式子还有解。
后面 SPFA 操作就很套路了。
至于求最大的值,二分答案一下就好了。
如果需要的话可以私信我要完整版代码,但感觉没什么好讲的。