zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    python编程基础之十四
    python编程基础之十三
    python编程基础之十二
    C++11的新特性
    第六章 分支语句和逻辑运算符
    第五章 循环和关系表达式
    C++ 管理数据内存的方法
    C++数组和指针
    第二、三章 开始学习C++、数据处理
    第一章 预备知识
  • 原文地址:https://www.cnblogs.com/nextbin/p/3924421.html
Copyright © 2011-2022 走看看