题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1823
题目大意:
I H A L: 把(H,A)处的值设为L.
Q H1 H2 A1 A2 :求(H1,A1)--->(H2,A2)中的最大值.
题目思路:
100<=H<=200 , 0<=A*10<=1000, 果断的二维单点线段树.
代码:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define ull unsigned __int64
#define ll __int64
//#define ull unsigned long long
//#define ll long long
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define middle (l+r)>>1
#define MOD 1000000007
#define esp (1e-4)
const int INF=0x3F3F3F3F;
const double DINF=10001.00;
//const double pi=acos(-1.0);
const int N=110,M=1010;
int n,m;
int mmax[N<<2][M<<2];
char op[2];
void PushUp(int x,int rt){
mmax[x][rt]=max(mmax[x][rt<<1],mmax[x][rt<<1|1]);
}
void yUpdate(int l,int r,int rt,int xrt,int y,int c){
if(l==r){
mmax[xrt][rt]=max(mmax[xrt][rt],c);
return;
}
int mid=middle;
if(y<=mid) yUpdate(lson,xrt,y,c);
else yUpdate(rson,xrt,y,c);
PushUp(xrt,rt);
}
void xUpdate(int l,int r,int rt,int x,int y,int c){
yUpdate(0,1000,1,rt,y,c);
if(l==r) return;
int mid=middle;
if(x<=mid) xUpdate(lson,x,y,c);
else xUpdate(rson,x,y,c);
}
int yQuery(int l,int r,int rt,int xrt,int L,int R){
if(L<=l && r<=R) return mmax[xrt][rt];
int mid=middle,ret=-1;
if(L<=mid) ret=max(ret,yQuery(lson,xrt,L,R));
if(mid<R) ret=max(ret,yQuery(rson,xrt,L,R));
return ret;
}
int xQuery(int l,int r,int rt,int L,int R,int yL,int yR){
if(L<=l && r<=R) return yQuery(0,1000,1,rt,yL,yR);
int mid=middle,ret=-1;
if(L<=mid) ret=max(ret,xQuery(lson,L,R,yL,yR));
if(mid<R) ret=max(ret,xQuery(rson,L,R,yL,yR));
return ret;
}
int main(){
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
int i,j,k,H1,H2;
double A1,A2,L;
//int T,cas;scanf("%d",&T);for(cas=1;cas<=T;cas++)
while(~scanf("%d",&m) && m){
memset(mmax,-1,sizeof(mmax));//double不可以这样直接赋为-1,会出问题滴.
while(m--){
scanf("%s",op);
if(op[0]=='I'){
scanf("%d%lf%lf",&H1,&A1,&L);
xUpdate(100,200,1,H1,A1*10,L*10);
}else{
scanf("%d%d%lf%lf",&H1,&H2,&A1,&A2);
if(H1>H2) swap(H1,H2);
if(A1>A2) swap(A1,A2);
L=xQuery(100,200,1,H1,H2,A1*10,A2*10);
if(L>=0) printf("%.1lf\n",L/10);
else puts("-1");
}
}
}
return 0;
}