CF1041F Ray in the tube構造_思維
阿新 • • 發佈:2018-12-15
不難發現起點必定是一個點。 每次間隔的距離一定是 ,關鍵就是要判斷兩點是否在同一跳躍距離上可被同時覆蓋。 我們可以對上邊進行 ,這樣對於多個點是否可以在距離為 的情況下被同時訪問做判斷。我們開一個 ,用於對映這些關鍵值的數量。即一旦得出一個關鍵值,在 上進行自增即可。
Code:
#include<bits/stdc++.h>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
const int maxn = 1000000 + 4;
const long long MAX = 1000000000;
long long up[maxn];
long long down[maxn];
map<long long, int> M;
inline void init(){ M.clear();}
int n,m;
long long x, y;
scanf("%d%I64d",&n,&x);
for(int i = 1;i <= n; ++i) scanf("%I64d",&up[i]);
scanf("%d%I64d",&m,&y);
for(int i = 1;i <= m; ++i) scanf("%I64d",&down[i]);
int ans = 0;
for(int i = 1;i <= n; ++i) ++M[up[i]];
for(int i = 1;i <= m; ++i) ++M[down[i]];
for(auto v : M) ans = max(ans, v.second);
for(long long dx = 1; dx <= MAX; dx <<= 1)
{
long long mod = (dx << 1);
init();
for(int i = 1;i <= n; ++i)++M[up[i] % mod];
for(int i = 1;i <= m; ++i)++M[(down[i] + dx) % mod];
for(auto v : M) ans = max(ans, v.second);
}
printf("%d",ans);
return 0;
}