标签:c++
8 I 160 50.5 60.0 I 165 30.0 80.5 I 166 10.0 50.0 I 170 80.5 77.5 Q 150 166 10.0 60.0 Q 166 177 10.0 50.0 I 166 40.0 99.9 Q 166 177 10.0 50.0 0
80.5 50.0 99.9
标准二维线段树模板。。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
int la,ra;
int max1; //存该段最大值
};
struct node1
{
int left,right;
node w[4005]; //活泼度乘10整形更好比较
} q[405]; //身高可减100(0~100之间)
int num;
void sub_build(int la,int ra,int i1,int i) //二维
{
q[i].w[i1].la=la;
q[i].w[i1].ra=ra;
q[i].w[i1].max1=-1;
if(la==ra)
return;
int m=(la+ra)/2;
sub_build(la,m,2*i1,i);
sub_build(m+1,ra,2*i1+1,i);
}
void build(int left,int right,int la,int ra,int i) //建树
{
q[i].left=left;
q[i].right=right;
sub_build(la,ra,1,i);
if(left==right)
return;
int m=(left+right)/2;
build(left,m,la,ra,2*i);
build(m+1,right,la,ra,2*i+1);
}
void sub_update(int b,int c,int i1,int i)
{
if(c>q[i].w[i1].max1)
{
q[i].w[i1].max1=c;
}
if(q[i].w[i1].la==q[i].w[i1].ra)
return;
if(b<=q[i].w[2*i1].ra)
sub_update(b,c,2*i1,i);
else
sub_update(b,c,2*i1+1,i);
}
void update(int a,int b,int c,int i)
{
sub_update(b,c,1,i);
if(q[i].left==q[i].right)
{
return;
}
if(a<=q[2*i].right)
update(a,b,c,2*i);
else
update(a,b,c,2*i+1);
}
int sub_query(int a1,int a2,int i1,int i)
{
if(q[i].w[i1].la==a1&&q[i].w[i1].ra==a2)
{
return q[i].w[i1].max1;
}
if(a2<=q[i].w[2*i1].ra)
return sub_query(a1,a2,2*i1,i);
else if(a1>=q[i].w[2*i1+1].la)
return sub_query(a1,a2,2*i1+1,i);
else
{
return max(sub_query(a1,q[i].w[2*i1].ra,2*i1,i),sub_query(q[i].w[2*i1+1].la,a2,2*i1+1,i));
}
}
void query(int h1,int h2,int a1,int a2,int i)
{
if(q[i].left==h1&&q[i].right==h2)
{
num= max(num,sub_query(a1,a2,1,i));
return;
}
if(h2<=q[2*i].right)
query(h1,h2,a1,a2,2*i);
else if(h1>=q[2*i+1].left)
query(h1,h2,a1,a2,2*i+1);
else
{
query(h1,q[2*i].right,a1,a2,2*i);
query(q[2*i+1].left,h2,a1,a2,2*i+1);
}
}
int main()
{
int t,m,n,i,j,s,a,a1,bb,cc,bb1;
double b,b1,c1,c;
char ww;
while(scanf("%d",&t)!=EOF)
{
if(t==0)
break;build(0,100,0,1000,1);
while(t--)
{
cin>>ww;
if(ww=='I')
{
scanf("%d%lf%lf",&a,&b,&c);
a=a-100;
bb=(int)(b*10);
cc=(int)(c*10);
update(a,bb,cc,1);
}
else
{
scanf("%d%d%lf%lf",&a,&a1,&b,&b1);
a=a-100;
a1=a1-100;
if(a>a1)
swap(a,a1);
bb=(int)(b*10);
bb1=(int)(b1*10);
if(bb>bb1)
swap(bb,bb1);
num=-1;
query(a,a1,bb,bb1,1);
if(num==-1)
cout<<-1<<endl;
else
printf("%.1lf\n",(double)(num*1.0)/10);
}
}
}
return 0;
}
HDU 1823 Luck and Love 二维线段树,布布扣,bubuko.com
标签:c++
原文地址:http://blog.csdn.net/axuan_k/article/details/38421967