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

二维线段树 -- 点更段查

#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\n",ans);
}
}
}
return 0;
}

HDU 1823 Luck and Love(二维线段树)的更多相关文章

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

    点击打开链接 Luck and Love Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  2. hdu 1823 Luck and Love 二维线段树

    题目链接 很裸的题, 唯一需要注意的就是询问时给出的区间并不是l<r, 需要判断然后交换一下, WA了好多发... #include<bits/stdc++.h> using nam ...

  3. HDU1823 Luck ans Love 二维线段树

    Luck and Love HDU - 1823 世界上上最远的距离不是相隔天涯海角 而是我在你面前 可你却不知道我爱你                 ―― 张小娴 前段日子,枫冰叶子给Wiskey ...

  4. [hdu1823]Luck and Love(二维线段树)

    解题关键:二维线段树模板题(单点修改.查询max) #include<cstdio> #include<cstring> #include<algorithm> # ...

  5. hdu 5465 Clarke and puzzle 二维线段树

    Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  6. HDU 4819 Mosaic(13年长春现场 二维线段树)

    HDU 4819 Mosaic 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4819 题意:给定一个n*n的矩阵,每次给定一个子矩阵区域(x,y,l) ...

  7. Luck and Love(二维线段树)

    Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  8. hdu 4819 二维线段树模板

    /* HDU 4819 Mosaic 题意:查询某个矩形内的最大最小值, 修改矩形内某点的值为该矩形(Mi+MA)/2; 二维线段树模板: 区间最值,单点更新. */ #include<bits ...

  9. HDU 4819 Mosaic (二维线段树)

    Mosaic Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total S ...

随机推荐

  1. javascript简单的认识下return语句+2015的总结+2016的展望

    好久没更新博客了...自从有了mac之后世界变得简单了...日常么,除了研究代码,看别人的代码,写自己的代码.就那样.... 吐槽点:window配个nodejs的环境花了九头牛两只老虎的力气,mac ...

  2. cocos布局分析

    HBox和VBox布局 HBox只是一个水平布局包装类. HBox里面所有的孩子节点都会水平排列成一行 VBox仅仅是对垂直布局的一个简便的类封装. VBox把它的子节点布局在一竖列中. Layout ...

  3. 【PHP面向对象(OOP)编程入门教程】11.类的继承

    继承作为面向对象的三个重要特性的一个方面,在面向对象的领域有着及其重要的作用,好像没听说哪个面向对象的语言不支持继承. 继承是PHP5面象对象程序设计的重要特性之一,它是指建立一个新的派生类,从一个或 ...

  4. IDEA之创建不了.java文件解决

    1.问题:在IDEA中新建的maven项目,无法创建.java文件 从上图看出,在new对应的栏目中没有java class选项 2.解决 这是因为maven的配置问题 应该如下: 注:如果这样还不行 ...

  5. ASP.NET后台输出js大全,页面顶部、form表单中前面与后面、和UpdatePanel(ScriptManager、AJAX)输出JS

    Response.Write 与   Page.ClientScript.RegisterStartupScript 与 Page.ClientScript.RegisterClientScriptB ...

  6. linux下好用的软件

    搜狗输入法 http://pinyin.sogou.com/linux/ wps http://community.wps.cn/download/ 浏览器 chrome or FireFox or ...

  7. nginx命令

    window  cmd 到nginx的文件夹 start nginx    启动命令 nginx -s reload 重新启动 nginx -s stop   关闭   linux   到 sbin ...

  8. Unity开发-你必须知道的优化建议

    转自:http://blog.csdn.net/leonwei/article/details/18042603 最近研究U3D开发,个人认为,精通一种新的技术,最快最好的方法就是看它的documen ...

  9. STL next_permutation和prev_permutation函数

    利用next_permutation实现全排列升序输出,从尾到头找到第一个可以交换的位置, 直接求到第一个不按升序排列的序列. #include <iostream> #include & ...

  10. C++和C中的函数如何相互调用

    今天笔试遇到的一题,当时就写了在函数前声明为C,按C编译. 首先是在C中调用C++函数,包括普通函数,重载函数以及成员函数. 对于普通函数,在C++中声明为extern "C",在 ...