题目:Luck and Love

题意:当操作符为‘I’时,表示有一个MM报名,后面接着一个整数,H表示身高,两个浮点数,A表示活泼度,L表示缘分值。

(100<=H<=200, 0.0<=A,L<=100.0)

当操作符为‘Q’时,后面接着四个浮点数,H1,H2表示身高区间,A1,A2表示活泼度区间,输出符合身高和活泼度要求的MM中的

缘分最高值。 (100<=H1,H2<=200, 0.0<=A1,A2<=100.0)

其实对于二维线段树,可以这样理解:

母树保存x轴上面的信息;子树保存当y轴上的信息;

所以我们每当对母树进行更新或者建立的时候,都要对母树所对应的子树进行所有的建立;

就相当于,先考虑x轴的范围,然后当x的范围一定时,在考虑对于x范围内的y值范围!^_^

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int N=2050;
struct sub_node
{
int la,ra;
int max;
};
struct node
{
int l,r;
sub_node T[N];
};
node TT[N];
void sub_build(int rt,int sub_rt,int la,int ra)
{
TT[rt].T[sub_rt].la=la;
TT[rt].T[sub_rt].ra=ra;
TT[rt].T[sub_rt].max=-1;
if(la==ra) return;
int mid=(la+ra)>>1;
sub_build(rt,sub_rt<<1,la,mid);
sub_build(rt,sub_rt<<1|1,mid+1,ra);
}
void build(int rt,int l,int r,int la,int ra)
{
TT[rt].l=l;
TT[rt].r=r;
sub_build(rt,1,la,ra);
if(l==r) return;
int mid=(l+r)>>1;
build(rt<<1,l,mid,la,ra);
build(rt<<1|1,mid+1,r,la,ra);
}
void sub_update(int rt,int sub_rt,int active,int love)
{
if(TT[rt].T[sub_rt].la==TT[rt].T[sub_rt].ra)
{
TT[rt].T[sub_rt].max=max(TT[rt].T[sub_rt].max,love);
return;
}
int mid=(TT[rt].T[sub_rt].la+TT[rt].T[sub_rt].ra)>>1;
if(active<=mid)
sub_update(rt,sub_rt<<1,active,love);
else
sub_update(rt,sub_rt<<1|1,active,love);
TT[rt].T[sub_rt].max=max(TT[rt].T[sub_rt].max,love);
}
void update(int rt,int height,int active,int love)
{
sub_update(rt,1,active,love);
if(TT[rt].l==TT[rt].r) return;
int mid=(TT[rt].l+TT[rt].r)>>1;
if(height<=mid)
update(rt<<1,height,active,love);
else
update(rt<<1|1,height,active,love);
}
int sub_query(int rt,int sub_rt,int a1,int a2)
{
if(TT[rt].T[sub_rt].la==a1&&TT[rt].T[sub_rt].ra==a2)
return TT[rt].T[sub_rt].max;
int mid=(TT[rt].T[sub_rt].la+TT[rt].T[sub_rt].ra)>>1;
if(a2<=mid)
return sub_query(rt,sub_rt<<1,a1,a2);
else if(a1>mid)
return sub_query(rt,sub_rt<<1|1,a1,a2);
else
return max(sub_query(rt,sub_rt<<1,a1,mid),sub_query(rt,sub_rt<<1|1,mid+1,a2));
}
int query(int rt,int h1,int h2,int a1,int a2)
{
if(TT[rt].l==h1&&TT[rt].r==h2)
return sub_query(rt,1,a1,a2);
int mid=(TT[rt].l+TT[rt].r)>>1;
if(h2<=mid)
return query(rt<<1,h1,h2,a1,a2);
else if(h1>mid)
return query(rt<<1|1,h1,h2,a1,a2);
else
return max(query(rt<<1,h1,mid,a1,a2),query(rt<<1|1,mid+1,h2,a1,a2));
}
int main()
{
int n,i;
int active,love;
char str[5];
while(~scanf("%d",&n))
{
if(n==0) break;
build(1,100,200,0,1000);
for(i=0;i<n;i++)
{
scanf("%s",str);
if(str[0]=='I')
{
int h;
double a,l;
scanf("%d%lf%lf",&h,&a,&l);
active=(int)10*a;
love=(int)10*l;
update(1,h,active,love);
}
else
{
int h1,h2;
double a1,a2;
scanf("%d%d%lf%lf",&h1,&h2,&a1,&a2);
int aa1=(int)10*a1;
int aa2=(int)10*a2;
if(h1>h2) swap(h1,h2);
if(aa1>aa2) swap(aa1,aa2);
double ans=query(1,h1,h2,aa1,aa2);
if(ans<0) puts("-1");
else      printf("%.1lf\n",ans/10);
}
}
}
return 0;
}

HDU1823(二维线段树)相关推荐

  1. 10.25T2 二维线段树

    Description 为了准备校庆庆典,学校招募了一些学生组成了一个方阵,准备在庆典上演出. 这个方阵是一个n*m的矩形,第i行第j列有一名学生,他有一个能力值Ai,j. 校长会定期检查一个p*q的 ...

  2. BZOJ2877 NOI2012魔幻棋盘(二维线段树)

    显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形 ...

  3. POJ2155二维线段树

    题意:      给一个n*n的01矩阵,然后有两种操作(m次)C x1 y1 x2 y2是把这个小矩形内所有数字异或一遍,Q x y 是询问当前这个点的值是多少?n<=1000 m<=5 ...

  4. poj1195 Mobile phones 二维线段树入门

    二维线段树就是树套树,线段树套线段树... #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  5. POJ-2155 Matrix 二维线段树 | 树状数组

    题目链接:http://poj.org/problem?id=2155 比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2). 也可以用树状数 ...

  6. [POJ2155] Matrix(二维线段树,树套树)

    题目链接:http://poj.org/problem?id=2155 题意:给一个01矩阵,两个操作,翻转:子矩阵里每一个数都由0变1,1变0. 查询:查询某一点是0还是1. 一直以为二维线段树就是 ...

  7. 【NOI2019】弹跳【二维线段树】【dijkstra】

    题意:一个w×hw\times hw×h的二维平面上有nnn个城市,有mmm个弹跳装置,第iii个可以花费tit_iti​的时间从城市pip_ipi​跳到矩形x∈[l,r],y∈[u,d]x\in [ ...

  8. 模板:二维线段树(线段树套线段树)

    文章目录 问题 解析 单点修改 询问 完整代码 标记永久化 代码 所谓二维线段树,就是有两个维度的线段树 (逃) 问题 给出一个矩形 要求支持以下操作: 1.询问一个子矩形的最值 2.修改某一个单点的 ...

  9. BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j)if(a[j ...

最新文章

  1. linux操作普通文件夹,Linux学习--2.文件管理的基本命令
  2. linux mv 保持目录结构_(三)Linux系统目录结构
  3. c调用python第三方库_Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递...
  4. 图片连续向左向右向下向上滚动和左右运动、指向停止js代码
  5. 如何跟成功的男人谈恋爱?
  6. 请求之前~HttpHandler实现媒体文件和图像文件的盗链
  7. 极客大学架构师训练营-架构师技术图谱-大作业二
  8. python语言是胶水语言吗_为什么只有python是胶水语言?
  9. 尚学堂马士兵Oracle教程 笔记
  10. 3dmax渲染很慢/很卡?
  11. 英特尔卖了通信与手机处理器,中国厂商是哭还是笑?
  12. 1-甲基-3-丁基咪唑四卤化铁([C4mim]FeX4,X=Cl,Br)磁性离子液体
  13. 计算机操作系统虚拟内存管理
  14. 怎么关闭win10自动更新?我们可以这么做!
  15. 阿里云备案要几天时间?
  16. 微信域名防封方案,微信分享的链接经常被微信屏蔽甚至封停怎能解决
  17. 【AmazeUI】模态框
  18. 欺骗无数人眼睛的Magic Leap亮出真本事!公布AR系统路线和16项Demo
  19. 用PS制作红色金属网页模板
  20. 微信公众号禁止虚拟支付业务

热门文章

  1. Redis LRU 淘汰原理
  2. 【技术改造】电商系统用户模块集成Feign-1
  3. 往IOC 容器中添加组件的方式
  4. maven项目概念模型图
  5. 测试串行回收与堆初始值有关系01
  6. 验证用户输入的是不是中文名字 淘宝精品案例 元素样式设置的方式 链式编程
  7. gitlab-ci详细说明
  8. FutureTask源码
  9. sketchup作品_18级园林工程技术专业课程实训作品展
  10. 【图文详解】JAVA中的转义字符