【BZOJ】3834: [Poi2014]Solar Panels

针对求最大值问题,探讨了在特定区间内寻找满足条件的最大整数解的算法实现。通过对输入区间的处理和枚举操作,实现了在复杂度O(N4√smax)下解决问题。文章详细解释了算法思路,包括数据预处理、区间判断和倍数关系的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.lydsy.com/JudgeOnline/problem.php?id=3834

题意:求$max\{(i,j)\}, smin<=i<=smax, wmin<=i<=wmax$,其中$smin<=smax<=10^9, wmin<=wmax<=10^9$,有$N<=1000$组数据

#include <bits/stdc++.h>
using namespace std;
int main() {
	int cs, smin, smax, wmin, wmax, ans; scanf("%d", &cs);
	while(cs--) {
		scanf("%d%d%d%d", &smin, &smax, &wmin, &wmax);
		if(smax>wmax) swap(smin, wmin), swap(smax, wmax);
		ans=1;
		if(wmin<=smax && smax<=wmax) ans=smax;
		else {
			--smin; --wmin;
			for(int d=smax, pos; d; d=pos) {
				pos=max(smax/(smax/d+1), wmax/(wmax/d+1));
				if(smin>=d) pos=max(pos, smin/(smin/d+1));
				if(wmin>=d) pos=max(pos, wmin/(wmin/d+1));
				if(smax/d-smin/d>0 && wmax/d-wmin/d>0) { ans=d; break; }
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

  

假设$smax<=wmax$

如果$wmin<=smax<=wmax$,显然答案就是$smax$

考虑枚举$d=gcd$,那么转换为在区间$[ \lfloor \frac{smin}{d} \rfloor, \lfloor \frac{smax}{d} \rfloor ] 和 [ \lfloor \frac{wmin}{d} \rfloor, \lfloor \frac{wmax}{d} \rfloor ]$找$[(i, j)]=1$表示存在$gcd(i,j)=d$

于是我就很sb了............我为什么一定要$[(i,j)]=1$呢.............然后膜拜了zyf千古神犇....发现其实$[(i,j)]>=1$就行了= =.............因为我很sb没想到.......倍数关系啊= =

于是分块查询即可..

复杂度$O(N4\sqrt{smax})$

转载于:https://www.cnblogs.com/iwtwiioi/p/4274849.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值