Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef pair< int,int > ii;
- typedef pair<double,ii> dii;
- int N,C,K,asd;
- double D;
- set<dii> closes;
- priority_queue<dii> pq;
- bool cmpX(const ii &a, const ii &b) {
- return a.first < b.first;
- }
- bool cmpY(const ii &a, const ii &b) {
- return a.second < b.second;
- }
- struct node{
- int point[2];
- node * left , * right;
- node(){}
- node(int * arr, node * l, node * r){
- memcpy(point,arr,sizeof point);
- left = l; right = r;
- }
- node(int x, int y, node * l, node * r){
- point[0] = x; point[1] = y;
- left = l; right = r;
- }
- double distNode(int * p){
- return hypot(point[0] - p[0],point[1] - p[1]);
- }
- };
- // Cria um novo nรณ
- node * newNode(int * arr)
- {
- node * temp = new node(arr,0,0);
- return temp;
- }
- node * build(vector<ii> & pontos, int depth, int l, int r)
- {
- if(l > r) return 0;
- if(l == r) return new node(pontos[l].first,pontos[l].second,0,0);
- node * root = 0;
- int nivel = depth % 2;
- asd = max(asd,depth);
- int mid = (l+r)/2;
- if(nivel == 0) sort(pontos.begin() + l , pontos.begin()+ r + 1,cmpX);
- else sort(pontos.begin() + l , pontos.begin() + r + 1 , cmpY);
- node * left = build(pontos , depth+1 , l , mid-1);
- node * right = build(pontos , depth+1 , mid+1 , r);
- return root = new node(pontos[mid].first,pontos[mid].second,left,right);
- }
- node * NNS2(node * root, node * best, int * point, int depth)
- {
- cout<<"ASDA"<<endl;
- if(!root) return best;
- if(!best) best = root;
- if(root->distNode(point) < best->distNode(point))
- best = root;
- int dms = depth % 2;
- if(point[dms] < (root->point[dms]))
- best = NNS2(root->left,best,point,depth+1);
- best = NNS2(root->right,best,point,depth+1);
- return best;
- }
- bool find(node * root, int * point, int depth)
- {
- if(!root)
- return 0;
- if(!memcmp(point,root->point,sizeof *point))
- return 1;
- int cd = depth % 2;
- if(point[cd] < (root->point[cd]))
- return find(root->left,point,depth+1);
- return find(root->right,point,depth+1);
- }
- int main()
- {
- freopen("in","r",stdin);
- int p[2];
- vector<ii> pontos;
- while(scanf("%d%d%d%lf",&N,&C,&K,&D) == 4)
- {
- int resp = 0;
- node * root = 0;
- pontos.clear();
- while(N--)
- {
- scanf("%d%d",&p[0],&p[1]);
- pontos.push_back(ii(p[0],p[1]));
- }
- // construcao da kd tree
- // construcao da kd tree
- root = build(pontos,0,0,pontos.size()-1);
- while(C--)
- {
- scanf("%d%d",&p[0],&p[1]);
- cout<<">>>>>>>>>>>>>>>>>>>>>"<<p[0]<<' '<<p[1]<<endl;
- node * best = NNS2(root,0,p,0);
- cout<<" >> "<<p[0]<<' '<<p[1]<< " >> "<<best->point[0]<<" "<<best->point[1]<< ' '<<best->distNode(p)<<endl;
- }
- printf("%d\n",resp);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement