题目传送门

这道题乍看起来就像一道刚入门的蒟蒻练习数组的题目,但是数据范围为 ,不可能开下这么大的数组,怎么办呢?

莫慌,总点数只有 个,所有点能走一次“日”到达的点最多也就 个,我们可以用 stl 中的 mappair<int,int> 作为键,来维护每个点能攻击到的点个数,注意一下原本点所在的位置不能放马就可以了。

代码如下,时间复杂度

#include <bits/stdc++.h>
#define pii pair<int, int>
#define fi first
#define se second
#define mkp make_pair
using namespace std;
const int N=2e5+5, nx[]={-1,-2,-2,-1,1,2,2,1}, ny[]={-2,-1,1,2,2,1,-1,-2};
int n, x[N], y[N], ans, ansx, ansy;
map<pii, int> mp;
int main(){
	scanf("%d", &n);
	for(int i=1; i<=n; ++i){
		scanf("%d%d", &x[i], &y[i]);
		mp[mkp(x[i],y[i])] = -1;
	}
	int t;
	for(int i=1; i<=n; ++i){
		for(int j=0,xx,yy; j<8; ++j){
			xx=x[i]+nx[j], yy=y[i]+ny[j];
			if(xx>0 && yy>0 && mp[mkp(xx,yy)]!=-1){
				t = ++mp[mkp(xx,yy)];
				if(t > ans){
					ansx=xx, ansy=yy, ans=t;
				}
			}
		}
	}
	printf("%d %d\n", ansx, ansy);
	return 0;
}