【二維線段樹】HDU 1823

這道題是道裸的二維線段樹,但要注意細節處理,比如說在將double強制轉換成int時不要忘記加一個eps,還有就是-1的特殊處理,不要認爲初始化成-1就可以直接輸出了,於是我就-1.0掛了好多回。

附上AC代碼:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

class Seg_Y
{
	public:
		int L, R;
		Seg_Y *l, *r;
		double v;
	public:
		Seg_Y(int L, int R): L(L), R(R) {
			v = -1;
			if (L == R) {
				l = r = 0;
				return;
			}
			int mid = (L+R)>>1;
			l = new Seg_Y(L, mid);
			r = new Seg_Y(mid+1, R);
		}
		void pushUp() {
			if (L == R)
				return;
			v = max(l ? l->v : 0, r ? r->v : 0);
		}
		void insert(int y, double verb) {
			if (L == R) {
				v = max(v, verb);
				return;
			}
			int mid = (L+R)>>1;
			if (y <= mid)
				l->insert(y, verb);
			else
				r->insert(y, verb);
			pushUp();
		}
		double query(int x, int y) {
			if (x <= L && y >= R) {
				return v;
			}
			int mid = (L+R)>>1;
			double ret = -1;
			if (x <= mid)
				ret = max(ret, l->query(x, y));
			if (y > mid)
				ret = max(ret, r->query(x, y));
			return ret;
		}
		~Seg_Y() {
			delete l;
			delete r;
		}
};

class Seg_X
{
	public:
		int L, R;
		Seg_X *l, *r;
		Seg_Y *v;
	public:
		Seg_X(int L, int R, int low, int high): L(L), R(R) {
			v = new Seg_Y(low, high);
			if (L == R) {
				l = r = 0;
				return;
			}
			int mid = (L+R)>>1;
			l = new Seg_X(L, mid, low, high);
			r = new Seg_X(mid+1, R, low, high);
		}
		void insert(int x, int y, double verb) {
			v->insert(y, verb);
			if (L == R) {
				return;
			}
			int mid = (L+R)>>1;
			if (x <= mid)
				l->insert(x, y, verb);
			else
				r->insert(x, y, verb);
		}
		double query(int x, int y, int p, int q) {
			if (x <= L && y >= R)
				return v->query(p, q);
			int mid = (L+R)>>1;
			double ret = -1;
			if (x <= mid)
				ret = max(l->query(x, y, p, q), ret);
			if (y > mid)
				ret = max(r->query(x, y, p, q), ret);
			return ret;
		}
		~Seg_X() {
			delete l;
			delete r;
			delete v;
		}
}*head = 0;

int main()
{
	int m;
	while (scanf("%d", &m) && m != 0) {
		char op;
		int x, y;
		double p, q;
		int ll, rr;
		if (!head)
			delete head;
		head = new Seg_X(100, 200, 0, 1000);
		double ans;
		while (m--) {
			getchar();
			scanf("%c", &op);
			if (op == 'I') {
				scanf("%d %lf %lf", &x, &p, &q);
				y = (int)((p+1e-6)*10.0);
				//printf("!%d!\n", y);
				head->insert(x, y, q);
			} else {
				scanf("%d %d %lf %lf", &x, &y, &p, &q);
				if (x > y)
					swap(x, y);
				if (p > q)
					swap(p, q);
				ll = (int)((p+1e-6)*10.0);
				rr = (int)((q+1e-6)*10.0);
				//printf("!%d %d!\n", ll, rr);
				ans = head->query(x, y, ll, rr);
				if (ans == -1)
					printf("-1\n");
				else
					printf("%.1lf\n", ans);
			}
		}
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章