Auteur du Problème : | TheSensei |
Préparé par : | Hasan Saleh (MathModel) |
Édité par : | Hasan Saleh (MathModel) |
Solution
Remarquez que est petit, l'ensemble des points considérés comme "proches" d'un point est tous les points ayant une distance de Manhattan d'au plus , puis nous pouvons forcer tous les points de (x-a,y-b) où (-d \le a,b \le d) et compter ces points en utilisant une structure de données de carte, Notez que tous les points ne fonctionneront pas avec cette itération donc vous devez vérifier s'ils satisfont la condition de distance de Manhattan, ce qui donne une complexité totale de \mathcal{O}(n \cdot d^2)
//O(n^2)
#include<bits/stdc++.h>
using namespace std;
#define int long long
int ok(pair<int,int>a,pair<int,int>b,int d){
if(abs(a.first-b.first)+abs(a.second-b.second)<=d){
return 1;
}
return 0;
}
void solve(){
int n,d;cin>>n>>d;
vector<pair<int,int>>p(n);
map<pair<int,int>,int>mp;
for(auto &i:p){
cin>>i.first>>i.second;
mp[{i.first,i.second}]=1;
}
for(int i=0;i<n;i++){
int cur=0;
for(int x=p[i].first-d;x<=p[i].first+d;x++){
for(int y=p[i].second-d;y<=p[i].second+d;y++){
if(mp[{x,y}]){
if(!(x==p[i].first && y==p[i].second)){
if(ok({x,y},p[i],d)){
cur++;
}
}
}
}
}
cout<<cur<<" ";
}
cout<<"\n";
}
signed main(){
int t;cin>>t;
while(t--){
solve();
}
}Complexité \mathcal{O}(n \cdot d^2)