[HDOJ1823] Luck and Love(线段树,树套树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1823

体重就一位小数,可以扩展10倍更新。

坑在了更新人的时候,不应该直接更新,而应该求max,竟然在这里犯二。。

外层更新的时候,线段树的每一棵字数都要在判return之前update内层的树。相当于及时更新了吧。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3
  4 #define lrt rt << 1
  5 #define rrt rt << 1 | 1
  6 const double EXP = 1e-9;
  7 const int maxn = 210;
  8 const int maxm = 2020;
  9
 10 int m;
 11 char op[3];
 12
 13 typedef struct NodeY {
 14     double val;
 15 }NodeY;
 16
 17 typedef struct NodeX {
 18     NodeY segY[maxm<<2];
 19
 20     void pushup(int rt) {
 21         segY[rt].val = max(segY[lrt].val, segY[rrt].val);
 22     }
 23
 24     void build(int l, int r, int rt) {
 25         segY[rt].val = -1;
 26         if(l == r) return;
 27         int mid = (l + r) >> 1;
 28         build(l, mid, lrt);
 29         build(mid+1, r, rrt);
 30     }
 31
 32     void update(int p, double val, int l, int r, int rt) {
 33         if(l == r) {
 34             segY[rt].val = max(segY[rt].val, val);
 35             return;
 36         }
 37         int mid = (l + r) >> 1;
 38         if(p <= mid) update(p, val, l, mid, lrt);
 39         else update(p, val, mid+1, r, rrt);
 40         pushup(rt);
 41     }
 42
 43     double query(int L, int R, int l, int r, int rt) {
 44         if(L <= l && r <= R) return segY[rt].val;
 45         int mid = (l + r) >> 1;
 46         double ret = -1;
 47         if(L <= mid) ret = max(ret, query(L, R, l, mid, lrt));
 48         if(mid < R) ret = max(ret , query(L, R, mid+1, r, rrt));
 49         return ret;
 50     }
 51 }NodeX;
 52
 53 NodeX segX[maxn<<2];
 54
 55 void build(int l, int r, int rt) {
 56     segX[rt].build(1, 1000, 1);
 57     if(l == r) return;
 58     int mid = (l + r) >> 1;
 59     build(l, mid, lrt);
 60     build(mid+1, r, rrt);
 61 }
 62
 63 void update(int x, int y, double val, int l, int r, int rt) {
 64     segX[rt].update(y, val, 1, 1000, 1);
 65     if(l == r) return;
 66     int mid = (l + r) >> 1;
 67     if(x <= mid) update(x, y, val, l, mid, lrt);
 68     else update(x, y, val, mid+1, r, rrt);
 69 }
 70
 71 double query(int yl, int yr, int L, int R, int l, int r, int rt) {
 72     if(L <= l && r <= R) return segX[rt].query(yl, yr, 1, 1000, 1);
 73     double ret = -1;
 74     int mid = (l + r) >> 1;
 75     if(L <= mid) ret = max(ret, query(yl, yr, L, R, l, mid, lrt));
 76     if(mid < R) ret = max(ret, query(yl, yr, L, R, mid+1, r, rrt));
 77     return ret;
 78 }
 79
 80 int main() {
 81     // freopen("in", "r", stdin);
 82     int h, h1;
 83     double aa, ll;
 84     while(~scanf("%d", &m) && m) {
 85         build(1, 200, 1);
 86         while(m--) {
 87             scanf("%s", op);
 88             if(op[0] == ‘I‘) {
 89                 scanf("%d%lf%lf",&h,&aa,&ll);
 90                 int a = int(aa * 10.0 + EXP);
 91                 update(h, a, ll, 1, 200, 1);
 92             }
 93             else {
 94                 scanf("%d%d%lf%lf",&h,&h1,&aa,&ll);
 95                 int a = int(aa * 10.0 + EXP);
 96                 int b = int(ll * 10.0 + EXP);
 97                 if(h > h1) swap(h, h1);
 98                 if(a > b) swap(a, b);
 99                 double ret = query(a, b, h, h1, 1, 200, 1);
100                 if(ret == -1.0) puts("-1");
101                 else printf("%.1f\n", ret);
102             }
103         }
104     }
105     return 0;
106 }
时间: 2024-12-13 09:48:30

[HDOJ1823] Luck and Love(线段树,树套树)的相关文章

Luck and Love (二维线段树)(树套树)

Luck and Love Problem Description 世界上上最远的距离不是相隔天涯海角 而是我在你面前 可你却不知道我爱你 ―― 李丹妮 前段日子,枫冰叶子给Wiskey做了个征婚启事,聘礼达到500万哦,天哪,可是天文数字了啊,不知多少MM蜂拥而至,顿时万人空巷,连扫地的大妈都来凑热闹来了.―_―||| 由于人数太多,Wiskey实在忙不过来,就把统计的事情全交给了枫冰叶子,自己跑回家休息去了.这可够枫冰叶子忙的了,他要处理的有两类事情,一是得接受MM的报名,二是要帮Wiske

BZOJ_3196_二逼平衡树(树套树:线段树+Treap)

描述 可以处理区间问题的平衡树. 分析 树套树.可以用线段树套Treap.人生第一道树套树的题... op1:如果在整区间,直接在该区间的treap上求解.否则分两个区间求解,然后相加.最后+1. op2:这个不太好直接做,可以二分,每次假定一个值,用这个值去做op1,以此求得一个rank=k+1的数,求rank=k的数等价与求这个数的前驱pre. op3:先删后加. op4&op5:如果在整区间,直接在该区间的treap上求解,否则分量个区间求解,pre取最大值,suc取最小值.注意有些数在有

BZOJ3295 动态逆序对 树套树, 树状数组套线段树(主席树)

Orz黄学长,蒟蒻在黄学长的带领下,通过阅读黄学长的代码!终于会了这道题! 首先我想先说一下这道题的思路(准确来说是黄学长的). 很明显,树状数组应该不用讲吧!关键是内存怎么开,维护一些什么样的数据? 其实我们通过观察,很快可以发现,你维护被删的数比维护所有的数轻松多了(不管是空间上,还是时间上).所以我们就可以从这方面想!(其实我一开始的思路,因为这道题我已经看过很久了,一直想写,毕竟是白书里面的一道例题嘛!一开始,蒟蒻的我是打算这样的用树状数组套权值线段树,并且是维护所有的数,我发现空间不够

POJ 1195 2维线段树(树套树实现) 树状数组

1: #include <stdio.h> 2: #include <string.h> 3: #include <stdlib.h> 4: #include <algorithm> 5: #include <iostream> 6: using namespace std; 7:   8: #define LL(a) a<<1 9: #define RR(a) a<<1|1 10: const int MaxL = 10

【BZOJ3110】【Zjoi2013】K大数查询 树套树 权值线段树套区间线段树

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43020009"); } 题解: 外层权值线段树,内层区间线段树可解. 权值都是1~n,就不用离散化了. 我写了标记永久化. 其它心得神马的: 天生对树形数据结构无爱. 第一次写树套树,终于知道是怎么回事了. (只针对本题) 就是外层每个点都表示了一段

BZOJ 3196 二逼平衡树 树套树(线段树套Treap)

题目大意: 写一种数据结构,他可以: 1.查询k在区间内的排名. 2.查询区间内排名为k的值 3.修改某一个值. 4.求k在区间内的前驱. 5.求k在区间内的后继. 思路:本来以为有什么只有神犇才知道的神一般的数据结构来维护它,问了别人之后,发现只是树套树.据说怎么套都行.我见识鄙陋,就只能线段树套Treap了. 这也是第一次写树套树,还1A了,有点开心. 写树套树,一定要确定自己对这两个树及其熟练,加上少量精细的思考,就可以完成树套树.(我只是弱渣,求神犇别D) 具体实现:第一层是线段树,第二

POJ 2155 树套树—线段树套线段树

Matrix 楼教主出的题目. 题意:一个矩阵初始值都为0,每次给"C X1 Y1 X2 Y2" 去反转这个矩阵.或者"Q X1 Y1"查询这个点是0/1. 第一次接触树套树的题目. 一句AC:对于基本的线段树,再在每个节点建一个y方向上的线段树.tree[n][m] 这道题目更新的时候,对于X方向就是(X1,X2)这个区间,再在其上对Y1,Y2进行更新. 对于查询,X方向上,自顶向下到X1都要对Y进行查询(更新的区间必包括该点),Y方向上则更新到Y1. #incl

BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

题目大意:有一些位置,这些位置上可以放若干个数字.现在有两种操作. 1.在区间l到r上添加一个数字x 2.求出l到r上的第k大的数字是什么 思路:这种题一看就是树套树,关键是怎么套,怎么写.(话说我也不会来着..)最容易想到的方法就是区间线段树套一个权值线段树,但是区间线段树上的标记就会变得异常复杂.所以我们就反过来套,用权值线段树套区间线段树.这样修改操作在外线段树上就变成了单点修改,外线段树就不用维护标记了.在里面的区间线段树上维护标记就容易多了.具体实现见代码. CODE: #includ

知识点 - 线段树 权值 树套树 二维 可持续

知识点 - 线段树 权值 树套树 二维 可持续 //区间更新求和 inline int ls(int p) { return p << 1; }//左儿子 inline int rs(int p) { return p << 1 | 1; }//右儿子 void push_up(int p) { t[p] = t[ls(p)] + t[rs(p)]; }// 向上不断维护区间操作 void build(ll p, ll l, ll r) { if (l == r) { t[p] =

树套树-线段树套平衡树

树套树留坑 线段树套平衡树: 二逼平衡树 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<cmath> #include<map> #include<bitset> #pragma GCC optimize(2) #define rep(i,a,b) for(i