【KD tree】 TJU 4072 3D Birds-Shooting Game

来源:互联网 发布:乡镇网络舆情自查报告 编辑:程序博客网 时间:2024/05/17 03:39

KD树,看学长的代码,半抄半写的。。。

数据可能有错,题目说了 1≤x,y,z≤100000。。

但是可能有0,我把打掉的鸟设为0就WA,设为-1就AC了。。。

#include <iostream>#include <sstream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <climits>#define maxn 100010#define eps 1e-6#define mod 10007#define INF 99999999#define lowbit(x) (x&(-x))//#define lson o<<1, L, mid//#define rson o<<1 | 1, mid+1, Rtypedef long long LL;using namespace std;struct node{node *lson, *rson;int lx, rx, ly, ry;int x, y, loc;int maxv;}*head, no[maxn], *top;struct point{int x, y, z;}po[maxn];int split[maxn];int vx[maxn], vy[maxn];int LX, LY, RX, RY, ans;int ux, uy, uz;int n, m;int cmpx(point a, point b){return a.x < b.x ||(a.x == b.x && a.y < b.y);}int cmpy(point a, point b){return a.y < b.y ||(a.y == b.y && a.x < b.x);}void pushup(node *p){if(p->lson) {p->lx = min(p->lx, p->lson->lx);p->rx = max(p->rx, p->lson->rx);p->ly = min(p->ly, p->lson->ly);p->ry = max(p->ry, p->lson->ry);p->maxv = max(p->maxv, p->lson->maxv);}if(p->rson) {p->lx = min(p->lx, p->rson->lx);p->rx = max(p->rx, p->rson->rx);p->ly = min(p->ly, p->rson->ly);p->ry = max(p->ry, p->rson->ry);p->maxv = max(p->maxv, p->rson->maxv);}}node* build(int L, int R, int spt){if(L>R) return NULL;int mid = (R + L) >>1;split[mid] = spt;node *p = top++;if(spt) nth_element(po+L, po+mid, po+R+1, cmpx);else nth_element(po+L, po+mid, po+R+1, cmpy);p->x = po[mid].x, p->y = po[mid].y;p->maxv = p->loc = po[mid].z;p->lx = p->rx = po[mid].x;p->ly = p->ry = po[mid].y;p->lson = build(L, mid-1, !spt);p->rson = build(mid+1, R, !spt);pushup(p);return p;}void query(node *p){if(!p) return;if(p->maxv < ans) return;if(p->lx >= LX && p->rx <= RX && p->ly >= LY && p->ry <= RY){if(ans < p->maxv) ans = p->maxv;return;}if(p->x >=LX && p->x <=RX && p->y >= LY && p->y <=RY)if(ans < p->loc) ans = p->loc;if(p->lson)if(p->lson->lx <= RX && p->lson->rx >= LX && p->lson->ly <= RY && p->lson->ry >= LY)query(p->lson);if(p->rson)if(p->rson->lx <= RX && p->rson->rx >= LX && p->rson->ly <= RY && p->rson->ry >= LY)query(p->rson);}void updata(node *p){p->maxv = p->loc;if(p->x == ux && p->y == uy && p->maxv == uz){p->maxv = p->loc = -1;pushup(p);return;}if(p->lson)if(p->lson->lx <= ux && p->lson->rx >= ux && p->lson->ly <= uy && p->lson->ry >= uy)updata(p->lson);if(p->rson)if(p->rson->lx <= ux && p->rson->rx >= ux && p->rson->ly <= uy && p->rson->ry >= uy)updata(p->rson);pushup(p);}void init(void){top = no;memset(split, 0, sizeof split);}void read(void){int i;scanf("%d", &n);for(i = 1; i <= n; i++) {scanf("%d%d%d", &po[i].x, &po[i].y, &po[i].z);vx[po[i].z] = po[i].x, vy[po[i].z] = po[i].y;}}void work(void){scanf("%d", &m);while(m--){scanf("%d%d%d%d", &LX, &LY, &RX, &RY);ans=-1;query(head);if(ans==-1){printf("Where are the birds?\n");continue;}printf("%d %d %d\n", vx[ans], vy[ans], ans);ux=vx[ans], uy=vy[ans], uz=ans;updata(head);}}int main(void){int _;while(scanf("%d", &_)!=EOF) {while(_--){init();read();head=build(1, n, 0);work();}}return 0;}


0 0
原创粉丝点击