1. 程式人生 > >CF1041F Ray in the tube構造_思維

CF1041F Ray in the tube構造_思維

不難發現起點必定是一個點。 每次間隔的距離一定是 2k2^k,關鍵就是要判斷兩點是否在同一跳躍距離上可被同時覆蓋。 我們可以對上邊進行 x1x_{1}\equiv x2mod(2dx)x_{2} mod( 2*dx),這樣對於多個點是否可以在距離為 dxdx 的情況下被同時訪問做判斷。我們開一個 mapmap,用於對映這些關鍵值的數量。即一旦得出一個關鍵值,在 mapmap 上進行自增即可。

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; }