hdu1823 二维线段树

来源:互联网 发布:酒店网络电视解决方案 编辑:程序博客网 时间:2024/05/16 08:12
#include<iostream>#include<string.h>#include<stdio.h>#include<algorithm>#include<cmath>#define MAX 101#define L(x) (x<<1)#define R(x) (x<<1|1)using namespace std;class subnode{    public:        int l,r;        double val;        subnode(){};        subnode(int a,int b):l(a),r(b)        {}        void set(int a,int b)        {            l=a;            r=b;        }        bool leaf()        {            return l==r;        }        int mid()        {            return (l+r)>>1;        }        bool cover(int a,int b)        {            if(a<=l&&r<=b)              return true;            return false;        }};class node{    public:        int l,r;        subnode sub[MAX*10*3];        node(){};        node(int a,int b):l(a),r(b)        {}        void set(int a,int b)        {            l=a;            r=b;        }        bool leaf()        {            return l==r;        }        int mid()        {            return (l+r)>>1;        }        bool cover(int a,int b)        {            if(l>=a&&r<=b)              return true;            return false;        }}a[MAX*3];void subbuild(int t,int f,int l,int r){    a[t].sub[f].set(l,r);    a[t].sub[f].val=-1;    if(l==r)      return;    int mid=(l+r)>>1;    subbuild(t,L(f),l,mid);    subbuild(t,R(f),mid+1,r);}void build(int t,int x1,int x2,int y1,int y2){    a[t].set(x1,x2);    subbuild(t,1,y1,y2);    if(x1==x2)      return;    int mid=(x1+x2)>>1;    build(L(t),x1,mid,y1,y2);    build(R(t),mid+1,x2,y1,y2);}void subupdate(int t,int f,int l,int r,double val){    a[t].sub[f].val=max(a[t].sub[f].val,val);    if(a[t].sub[f].leaf())      return;    int mid=a[t].sub[f].mid();    if(l<=mid)      subupdate(t,L(f),l,r,val);    if(r>mid)      subupdate(t,R(f),l,r,val);}void update(int t,int x1,int x2,int y1,int y2,double val){    subupdate(t,1,y1,y2,val);    if(a[t].leaf())      return ;    int mid=a[t].mid();    if(x1<=mid)      update(L(t),x1,x2,y1,y2,val);    if(x2>mid)      update(R(t),x1,x2,y1,y2,val);}double subquery(int t,int f,int l,int r){    if(a[t].sub[f].cover(l,r))      return a[t].sub[f].val;    if(a[t].sub[f].leaf())return -1;    int mid=a[t].sub[f].mid();    double ans=-1;    if(l<=mid)      ans=max(ans,subquery(t,L(f),l,r));    if(r>mid)      ans=max(ans,subquery(t,R(f),l,r));    return ans;}double query(int t,int x1,int x2,int y1,int y2){    if(a[t].cover(x1,x2))      return subquery(t,1,y1,y2);    if(a[t].leaf())return -1;    int mid=a[t].mid();    double ans=-1;    if(x1<=mid)      ans=max(ans,query(L(t),x1,x2,y1,y2));    if(x2>mid)      ans=max(ans,query(R(t),x1,x2,y1,y2));    return ans;}int main(){    int n;    double x1,x2,y1,y2;    char s[2];    int eps=1e-6;    while(scanf("%d",&n))    {        if(n==0)break;        build(1,100,200,0,1000);        while(n--)        {            scanf("%s",s);            if(s[0]=='I')            {                scanf("%lf%lf%lf",&x1,&x2,&y1);                update(1,int(x1),int(x1),int(x2*10),int((x2)*10),y1);            }            else            {                scanf("%lf%lf%lf%lf",&x1,&x2,&y1,&y2);                if(x1>x2)                swap(x1,x2);//不加会错                if(y1>y2)                swap(y1,y2);                double ans=query(1,int(x1),int(x2),int((y1)*10),int((y2)*10));                if(ans==-1)                printf("-1\n");//输出-1,不是-1.0                else                printf("%.1lf\n",ans);            }        }    }}