【二维线段树】HDU 1823

来源:互联网 发布:法国工资 知乎 编辑:程序博客网 时间:2024/06/17 13:39

这道题是道裸的二维线段树,但要注意细节处理,比如说在将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);elser->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);elser->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");elseprintf("%.1lf\n", ans);}}}return 0;}


0 0
原创粉丝点击