Luck and Love

HDU - 1823

世界上上最远的距离不是相隔天涯海角 
而是我在你面前 
可你却不知道我爱你 
                ―― 张小娴 

前段日子,枫冰叶子给Wiskey做了个征婚启事,聘礼达到500万哦,天哪,可是天文数字了啊,不知多少MM蜂拥而至,顿时万人空巷,连扫地的大妈都来凑热闹来了。―_―||| 
由于人数太多,Wiskey实在忙不过来,就把统计的事情全交给了枫冰叶子,自己跑回家休息去了。这可够枫冰叶子忙的了,他要处理的有两类事情,一是得接受MM的报名,二是要帮Wiskey查找符合要求的MM中缘分最高值。 

Input本题有多个测试数据,第一个数字M,表示接下来有连续的M个操作,当M=0时处理中止。 
接下来是一个操作符C。 
当操作符为‘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)
所有输入的浮点数,均只有一位小数。 
Output对于每一次询问操作,在一行里面输出缘分最高值,保留一位小数。 
对查找不到的询问,输出-1。 
Sample Input

  1. 8
  2. I 160 50.5 60.0
  3. I 165 30.0 80.5
  4. I 166 10.0 50.0
  5. I 170 80.5 77.5
  6. Q 150 166 10.0 60.0
  7. Q 166 177 10.0 50.0
  8. I 166 40.0 99.9
  9. Q 166 177 10.0 50.0
  10. 0

Sample Output

  1. 80.5
  2. 50.0
  3. 99.9

——————————————————————————————————————————————————————————————————————————

处理二维表格中的数据修改和查询操作,用传说中的二维线段树。

首先第一维为行,把行建立线段树,线段树的节点代表1个到多个行。

然后把行线段树的每个节点对应的列建立线段树,每个节点代表在行节点控制范围内的1个到多个列。

时间负责度为log(m)*log(n),其中m和n代表行数和列数。

另外,还有一种写法,就是建立四叉线段树。也可以称为“矩形树”。实际上就是把矩形按照行和列的二分,分为4块区域。应该更好理解且更好写。只是据说这种写法复杂度有可能退化。

——————————————————————————————————————————————————————————————————————————

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 const int maxn=105;
  4. 4 const int maxm=1005;
  5. 5 struct Lie
  6. 6 {
  7. 7 int ll,lr;
  8. 8 int max;
  9. 9 };
  10. 10 struct Hang
  11. 11 {
  12. 12 int l,r;
  13. 13 Lie lie[maxm<<2];
  14. 14 }hang[maxn<<2];
  15. 15 int m,active,love,hight;
  16. 16 char s[2];
  17. 17 void buil(int hh,int cur,int l,int r)
  18. 18 {
  19. 19 hang[hh].lie[cur].ll=l;
  20. 20 hang[hh].lie[cur].lr=r;
  21. 21 hang[hh].lie[cur].max=-1;
  22. 22 if(l==r)return ;
  23. 23 int mid=(l+r)>>1;
  24. 24 buil(hh,cur<<1,l,mid);
  25. 25 buil(hh,cur<<1 | 1,mid+1,r);
  26. 26 }
  27. 27 void build(int cur,int l,int r,int ll,int lr)
  28. 28 {
  29. 29 hang[cur].l=l;hang[cur].r=r;
  30. 30 buil(cur,1,ll,lr);
  31. 31 if(l==r)return ;
  32. 32 int mid=(l+r)>>1;
  33. 33 build(cur<<1,l,mid,ll,lr);
  34. 34 build(cur<<1 | 1,mid+1,r,ll,lr);
  35. 35 }
  36. 36 void upda(int pre,int cur,int hh,int lh,int dat)
  37. 37 {
  38. 38 if(hang[pre].lie[cur].ll==hang[pre].lie[cur].lr)
  39. 39 {
  40. 40 hang[pre].lie[cur].max=max(hang[pre].lie[cur].max,dat);
  41. 41 return ;
  42. 42 }
  43. 43 int mid=(hang[pre].lie[cur].ll+hang[pre].lie[cur].lr)>>1;
  44. 44 if(lh<=mid)upda(pre,cur<<1,hh,lh,dat);
  45. 45 else upda(pre,cur<<1|1,hh,lh,dat);
  46. 46 hang[pre].lie[cur].max=max(hang[pre].lie[cur<<1].max,hang[pre].lie[cur<<1|1].max);
  47. 47 }
  48. 48 void update(int cur,int hh,int lh,int dat)
  49. 49 {
  50. 50 upda(cur,1,hh,lh,dat);
  51. 51 if(hang[cur].l==hang[cur].r)return;
  52. 52 int mid=(hang[cur].l+hang[cur].r)>>1;
  53. 53 if(hh<=mid)update(cur<<1,hh,lh,dat);
  54. 54 else update(cur<<1|1,hh,lh,dat);
  55. 55 }
  56. 56 float quer(int pre,int cur,int l1,int l2)
  57. 57 {
  58. 58 if(l1<=hang[pre].lie[cur].ll && hang[pre].lie[cur].lr<=l2)
  59. 59 return hang[pre].lie[cur].max;
  60. 60 int mid=(hang[pre].lie[cur].ll + hang[pre].lie[cur].lr)>>1;
  61. 61 float ans=-1;
  62. 62 if(l1<=mid)ans=max(ans,quer(pre,cur<<1,l1,l2));
  63. 63 if(mid<l2)ans=max(ans,quer(pre,cur<<1|1,l1,l2));
  64. 64 return ans;
  65. 65 }
  66. 66 float query(int cur,int h1,int h2,int l1,int l2)
  67. 67 {
  68. 68 if(h1<=hang[cur].l && hang[cur].r<=h2)return quer(cur,1,l1,l2);
  69. 69 int mid=(hang[cur].l+hang[cur].r)>>1;
  70. 70 float ans=-1;
  71. 71 if(h1<=mid)ans=max(ans,query(cur<<1,h1,h2,l1,l2));
  72. 72 if(h2>mid)ans=max(ans,query(cur<<1|1,h1,h2,l1,l2));
  73. 73 return ans;
  74. 74 }
  75. 75 int main()
  76. 76 {
  77. 77 while(scanf("%d",&m)==1 && m)
  78. 78 {
  79. 79 build(1,100,200,0,1000);
  80. 80 for(int i=0;i<m;i++)
  81. 81 {
  82. 82 scanf("%s",s);
  83. 83 if(s[0]=='I')
  84. 84 {
  85. 85 int h;
  86. 86 float act,lov;
  87. 87 scanf("%d%f%f",&h,&act,&lov);
  88. 88 active=(int)(10*act);
  89. 89 love=(int)(10*lov);
  90. 90 update(1,h,active,love);
  91. 91 }
  92. 92 else
  93. 93 {
  94. 94 int h1,h2;
  95. 95 float a1,a2;
  96. 96 scanf("%d%d%f%f",&h1,&h2,&a1,&a2);
  97. 97 int aa1=(int)(a1*10);
  98. 98 int aa2=(int)(a2*10);
  99. 99 if(h1>h2)swap(h1,h2);
  100. 100 if(aa1>aa2)swap(aa1,aa2);
  101. 101 double ans=query(1,h1,h2,aa1,aa2);
  102. 102 if(ans<0)printf("-1\n");
  103. 103 else printf("%.1f\n",ans/10);
  104. 104 }
  105. 105 }
  106. 106 }
  107. 107 return 0;
  108. 108 }

HDU1823 Luck ans Love 二维线段树的更多相关文章

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

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

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

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

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

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

  4. hdu1823(二维线段树模板题)

    hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...

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

    之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...

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

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

  7. HDU1832 二维线段树求最值(模板)

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

  8. POJ2155 Matrix二维线段树经典题

    题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...

  9. POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)

    题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...

随机推荐

  1. django-mdeditor支持七牛云存储图片

    由于django-mdeditor官方插件没有支持第三方存储,所以,我们只能进行修改源码的方式实现了. 本次改写即使替换了其文件,不使用七牛云也是无关紧要的,因为在存储时,去settings.py中判 ...

  2. Sentinel滑动窗口算法

    在前面搞清楚了Sentinel的使用后,大致理了一下Sentinel的责任链,搞清楚了这个,基本就已经梳理清楚sentinel-core模块的大部分内容,顺着这条链路可以继续梳理很多东西. 知其然.知 ...

  3. 粉丝投稿!从2月份的面试被拒到如今的阿里P7,说一说自己学java以来的经验!

    个人近期面试情况 今年二月以来,我的面试除了一个用友的,基本其他都被毙了,可以说是非常残酷的.其中有很多自己觉得还面的不错的岗位,比如百度.跟谁学.好未来等公司.说实话,打击比较大. 情况基本上是从三 ...

  4. 高效扩展工具让 VS Code 如虎添翼

    Codelf 变量命名神器 Star:10688 https://github.com/unbug/codelf 新建项目,变量,类,方法,接口都需要命名,一个好的命名可以一眼看出这个地方的功能,Co ...

  5. sprignAOP那些术语

    那些AOP术语 初看这么多术语,一下子都不好接受,慢慢来,很快就会搞懂.通知.增强处理(Advice) 就是你想要的功能,也就是上说的安全.事物.日志等.你给先定义好,然后再想用的地方用一下.包含As ...

  6. JavaScript基础知识梳理

    一.简单数据类型 Number.String.Boolean.Undefined.Null 1.Number: 方法: toPrecision( ) 返回指定长度的数字(范围是1到100) toFix ...

  7. Hbase学习Hbase基础介绍

    一.产生背景 自1970年以来,关系数据库用于数据存储和维护有关问题的解决方案.大数据的出现后,好多公司实现处理大数据并从中受益,并开始选择像Hadoop的解决方案.Hadoop使用分布式文件系统,用 ...

  8. Spring框架之spring-webmvc源码完全解析

    Spring框架之spring-webmvc源码完全解析 Spring框架提供了构建Web应用程序的全功能MVC模块.Spring MVC分离了控制器.模型对象.分派器以及处理程序对象的角色,支持多种 ...

  9. JIRA对接钉钉群机器人-实现任务的指派通知

    一.前提 Jira Software.钉钉群.RESTful服务.LDAP服务 二.流程图 三.对接步骤 1.创建项目群,把相关人员拉入群 2.钉钉群的智能群助手里添加自定义机器人 3.设置机器人,安 ...

  10. MySQL -- insert ignore语句

    项目实战 用户登记激活码记录插入接口 数据库测试实例,其中手机号和父设备id为唯一索引 当我们使用普通的insert语句插入一条数据库中已存在的手机号和父设备id的数据时,会报重复的key的错 当我们 ...