一个管道,从一端向另一端发射一条射线,问最多能够经过多少两端指定的点。
可能很斯波……隐约会感觉到有用的发射间距 $d$ 很少……实际上真的很少……因为只有 $d=2^k$ 有用。
为什么?因为如果 $d=t2^k$ 其中 $t$ 是奇数的话还不如 $2^k$ ,因为 $2^k$ 射奇数次回到同一端,覆盖了所有 $t2^k$ 能够覆盖到的点。
所以爆枚就好了,map
大法好。
特殊情况:上下两端都只有一个点且对称,只需要把最小答案赋值为 $2$ 就好了。
#include<cstdio>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int maxn=100000;
int n,a[maxn+5],m,b[maxn+5],ans;unordered_map<int,int> f;unordered_map<int,int>::iterator it;
int main(){
freopen("program.in","r",stdin);freopen("program.out","w",stdout);
scanf("%d%*d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);
scanf("%d%*d",&m);for (int i=1;i<=m;i++) scanf("%d",&b[i]);ans=2;
for (int d=1;d<=1e9;d<<=1){
f.clear();for (int i=1;i<=n;i++) f[a[i]%(d<<1)]++;for (int i=1;i<=m;i++) f[(b[i]+d)%(d<<1)]++;
for (it=f.begin();it!=f.end();it++) ans=max(ans,(*it).second);
}return printf("%d\n",ans),0;
}