题目链接
最近敲了些二维线段树,这也是我题单里的一道题,无非多出来的操作就是对区间端点的处理问题,给出的是浮点数,不如就把他向取整咯,一开始取整的时候总是会遇到些问题就是总是取不到恰好,会少位,怎么办呢?于是我这里学到了个骚操作:(int)(x*10. + efs);其中,efs指的是1e-6。
这道题还有另外的坑点,就是对与区间,并没有告诉你是左上角与右下角的关系,你得自己进行处理。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define efs 1e-6
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 105;
int M;
int tree[maxN<<2][maxN*10<<2];
void update_In(int rt, int x0, int l, int r, int qy, int val, bool flag)
{
if(l == r)
{
if(flag) tree[x0][rt] = max(tree[x0][rt], val);
else tree[x0][rt] = max(tree[x0<<1][rt], tree[x0<<1|1][rt]);
return;
}
int mid = (l + r)>>1;
if(qy<=mid) update_In(rt<<1, x0, l, mid, qy, val, flag);
else update_In(rt<<1|1, x0, mid+1, r, qy, val, flag);
tree[x0][rt] = max(tree[x0][rt<<1], tree[x0][rt<<1|1]);
}
void update_Out(int rt, int l, int r, int qx, int qy, int val)
{
if(l == r)
{
update_In(1, rt, 0, 1000, qy, val, true);
return;
}
int mid = (l + r)>>1;
if(qx<=mid) update_Out(rt<<1, l, mid, qx, qy, val);
else update_Out(rt<<1|1, mid+1, r, qx, qy, val);
update_In(1, rt, 0, 1000, qy, val, false);
}
double query_In(int rt, int x0, int l, int r, int ql, int qr)
{
if(ql<=l && qr>=r) return tree[x0][rt];
int mid = (l + r)>>1;
if(ql>mid) return query_In(rt<<1|1, x0, mid+1, r, ql, qr);
else if(qr<=mid) return query_In(rt<<1, x0, l, mid, ql, qr);
else
{
double ans = query_In(rt<<1|1, x0, mid+1, r, ql, qr);
ans = max(ans, query_In(rt<<1, x0, l, mid, ql, qr));
return ans;
}
}
double query_Out(int rt, int l, int r, int qlx, int qly, int qrx, int qry)
{
if(qlx<=l && qrx>=r) return query_In(1, rt, 0, 1000, qly, qry);
int mid = (l + r)>>1;
if(qlx>mid) return query_Out(rt<<1|1, mid+1, r, qlx, qly, qrx, qry);
else if(qrx<=mid) return query_Out(rt<<1, l, mid, qlx, qly, qrx, qry);
else
{
double ans = query_Out(rt<<1|1, mid+1, r, qlx, qly, qrx, qry);
ans = max(ans, query_Out(rt<<1, l, mid, qlx, qly, qrx, qry));
return ans;
}
}
int main()
{
while(scanf("%d", &M) && M)
{
memset(tree, -1, sizeof(tree));
while(M--)
{
char s[3];
scanf("%s", s);
if(s[0] == 'I')
{
int H;
double A, L;
scanf("%d", &H);
scanf("%lf%lf", &A, &L);
update_Out(1, 100, 200, H, (int)(10.*A+efs), (int)(10.*L+efs));
}
else
{
int H1, H2;
double A1, A2;
scanf("%d%d", &H1, &H2);
scanf("%lf%lf", &A1, &A2);
if(H1 > H2) swap(H1, H2);
if(A1 > A2) swap(A1, A2);
int tmp =query_Out(1, 100, 200, H1, (int)(10.*A1+efs), H2, (int)(10.*A2+efs));
if(tmp>=0) printf("%.1lf\n", 1.*tmp/10);
else printf("-1\n");
}
}
}
return 0;
}