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

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, R
typedef 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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值