HDU 1823 Luck and Love(二维线段树)

之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上。

二维线段树 -- 点更段查

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int N,M;
double ma[110<<2][1010<<2];
void pushUpY(int xu,int u){
	ma[xu][u]=max(ma[xu][u<<1], ma[xu][u<<1|1]);
}
void pushUpX(int xu,int u){
	ma[xu][u]=max(ma[xu<<1][u], ma[xu<<1|1][u]);
}
void updateY(int xu,int xl,int xr,int u,int l,int r,int x,int y,double val){
	if(l==r){
		ma[xu][u] = max(ma[xu][u], val);
		if(xl<xr) pushUpX(xu,u);
		return ;
	}
	int mid = (l+r)>>1;
	if(y<=mid) updateY(xu,xl,xr,u<<1,l,mid,x,y,val);
	else updateY(xu,xl,xr,u<<1|1,mid+1,r,x,y,val);
	pushUpY(xu,u);
}
void updateX(int u,int l,int r,int x,int y,double val){
	if(l==r){
		updateY(u,l,r,1,1,M,x,y,val);
		return ;
	}
	int mid = (l+r)>>1;
	if(x<=mid) updateX(u<<1,l,mid,x,y,val);
	else updateX(u<<1|1,mid+1,r,x,y,val);
	updateY(u,l,r,1,1,M,x,y,val);
}
double queryY(int xu,int u,int l,int r,int y1,int y2){
	if(l==y1 && r==y2) return ma[xu][u];
	int mid = (l+r)>>1;
	if(y2<=mid) return queryY(xu,u<<1,l,mid,y1,y2);
	else if(y1>mid) return queryY(xu,u<<1|1,mid+1,r,y1,y2);
	else return max(queryY(xu,u<<1,l,mid,y1,mid), queryY(xu,u<<1|1,mid+1,r,mid+1,y2));
}
double queryX(int u,int l,int r,int x1,int x2,int y1,int y2){
	if(l==x1 && r==x2) return queryY(u,1,1,M,y1,y2);
	int mid = (l+r)>>1;
	if(x2<=mid) return queryX(u<<1,l,mid,x1,x2,y1,y2);
	else if(x1>mid) return queryX(u<<1|1,mid+1,r,x1,x2,y1,y2);
	else return max(queryX(u<<1,l,mid,x1,mid,y1,y2), queryX(u<<1|1,mid+1,r,mid+1,x2,y1,y2));
}
void buildY(int xu,int u,int l,int r){
	ma[xu][u]=-1.;
	if(l==r) return ;
	int mid = (l+r)>>1;
	buildY(xu,u<<1,l,mid);
	buildY(xu,u<<1|1,mid+1,r);
}
void buildX(int u,int l,int r){
	if(l==r){buildY(u,1,1,M);return ;}
	int mid = (l+r)>>1;
	buildX(u<<1,l,mid);
	buildX(u<<1|1,mid+1,r);
	buildY(u,1,1,M);
}
int main(){
	int m;
	while(~scanf("%d",&m) && m){
		N=101,M=1001;
		buildX(1,1,N);
		char op[3];
		for(int i=0;i<m;++i){
			scanf("%s",op);
			if(op[0]=='I'){
				int h;double a,l;
				scanf("%d%lf%lf",&h,&a,&l);
				updateX(1,1,N,h-99,int(a*10)+1,l);
			}
			else {
				int h1,h2;double a1,a2;
				scanf("%d%d%lf%lf",&h1,&h2,&a1,&a2);
				if(h1>h2) swap(h1,h2);
				if(a1>a2) swap(a1,a2);
				double ans = queryX(1,1,N,h1-99,h2-99,int(a1*10)+1,int(a2*10)+1);
				if(ans<0) puts("-1");
				else printf("%.1lf
",ans);
			}
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/nextbin/p/3924421.html