题意就不赘述了。
二维线段树,第一维是高度,第二维是活泼值, 然后建立树套树。
/*
ID: CUGB-wwj
PROG:
LANG: C++
*/
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cmath>
#include <ctime>
#define INF 2000000000
#define MAXN 105
#define MAXM 1005
#define L(x) x<<1
#define R(x) x<<1|1
#define eps 1e-4
using namespace std;
struct Sub
{
int left, right;
int mx;
int mid(){ return (left + right) >> 1;}
};
struct node
{
int left, right;
Sub subtree[4 * MAXM];
int mid(){ return (left + right) >> 1;}
}tree[4 * MAXN];
void make_subtree(int s, int e, int C, int F)
{
tree[F].subtree[C].left = s;
tree[F].subtree[C].right = e;
tree[F].subtree[C].mx = -1;
if(s == e) return;
int mid = (s + e) >> 1;
make_subtree(s, mid, L(C), F);
make_subtree(mid + 1, e, R(C), F);
}
void make_tree(int s, int e, int C)
{
tree[C].left = s;
tree[C].right = e;
make_subtree(0, 1000, 1, C);
if(s == e) return;
int mid = (s + e) >> 1;
make_tree(s, mid, L(C));
make_tree(mid + 1, e, R(C));
}
void up_sub(int C, int F)
{
tree[F].subtree[C].mx = max(tree[F].subtree[L(C)].mx, tree[F].subtree[R(C)].mx);
}
void update_sub(int p, int v, int C, int F)
{
if(tree[F].subtree[C].left == tree[F].subtree[C].right)
{
tree[F].subtree[C].mx = max(tree[F].subtree[C].mx, v);
return;
}
int mid = tree[F].subtree[C].mid();
if(p <= mid) update_sub(p, v, L(C), F);
else update_sub(p, v, R(C), F);
up_sub(C, F);
}
void update(int pa, int pb, int v, int C)
{
update_sub(pb, v, 1, C);
if(tree[C].left == tree[C].right) return;
int mid = tree[C].mid();
if(pa <= mid) update(pa, pb, v, L(C));
else update(pa, pb, v, R(C));
}
int query_sub(int s, int e, int C, int F)
{
if(tree[F].subtree[C].left >= s && tree[F].subtree[C].right <= e) return tree[F].subtree[C].mx;
int mid = tree[F].subtree[C].mid();
int ret = -1;
if(s <= mid) ret = max(ret, query_sub(s, e, L(C), F));
if(mid < e) ret = max(ret, query_sub(s, e, R(C), F));
return ret;
}
int query(int s, int e, int s2, int e2, int C)
{
if(tree[C].left >= s && tree[C].right <= e) return query_sub(s2, e2, 1, C);
int mid = tree[C].mid();
int ret = -1;
if(s <= mid) ret = max(ret, query(s, e, s2, e2, L(C)));
if(mid < e) ret = max(ret, query(s, e, s2, e2, R(C)));
return ret;
}
int main()
{
int T;
char op[5];
while(scanf("%d", &T) != EOF && T)
{
make_tree(100, 200, 1);
while(T--)
{
scanf("%s", op);
int h1, h2;
double a1, a2, L;
if(op[0] == 'I')
{
scanf("%d%lf%lf", &h1, &a1, &L);
update(h1, (int)(a1 * 10 + eps), (int)(L * 10 + eps), 1);
}
else
{
scanf("%d%d%lf%lf", &h1, &h2, &a1, &a2);
if(h1 > h2) swap(h1, h2);
if(a1 > a2) swap(a1, a2);
int ret = query(h1, h2, (int)(a1 * 10 + eps), (int)(a2 * 10 + eps), 1);
if(ret < 0) puts("-1");
else printf("%.1f\n", ret / 10.0);
}
}
}
return 0;
}
本文介绍了一种使用二维线段树解决特定问题的方法。通过构建树套树的方式,第一维代表高度,第二维代表活泼值,有效地实现了区间更新与查询操作。
230

被折叠的 条评论
为什么被折叠?



