题解 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 操作就很套路了。

至于求最大的值,二分答案一下就好了。

如果需要的话可以私信我要完整版代码,但感觉没什么好讲的。

posted @ 2021-09-23 20:44  zplqwq  阅读(97)  评论(1编辑  收藏  举报