L - Lookup Performance

问对于一颗二叉搜索树来说,如果我们要找一个值域区间的值有多少个,他会向下递归查找几次,

设,第iii个节点所代表的最大最小值为li,ril_i, r_ili​,ri​,此时我们要查询L,RL, RL,R之间的值有多少个,

综上我们只要找到,有多少个li,ril_i, r_ili​,ri​,满足 ① li<L,ri≥Ll_i < L, r_i \geq Lli​<L,ri​≥L,② ri>R,li≤Lr_i > R, l_i \leq Lri​>R,li​≤L任意一个的点有多少个,然后对数量乘以二再加上一即可。

可以看作有多少条线段与L,RL, RL,R有交,并且,这些线段不能包含在L,RL, RL,R里。

#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10;int head[N], to[N], nex[N], cnt = 1;int minn[N], maxn[N], a[N << 2], tot, n, m;int l[N], r[N], st[N], ed[N], cnt1, cnt2;int root[N << 2], ls[N << 6], rs[N << 6], sum[N << 6], num;vector<int> vt[N << 2];void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void dfs(int rt, int fa) {for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa) {continue;}dfs(to[i], rt);minn[rt] = min(minn[rt], minn[to[i]]);maxn[rt] = max(maxn[rt], maxn[to[i]]);}
}void update(int &rt, int pre, int l, int r,int x, int v) {rt = ++num, ls[rt] = ls[pre], rs[rt] = rs[pre], sum[rt] = sum[pre] + v;if (l == r) {return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], ls[pre], l, mid, x, v);}else {update(rs[rt], rs[pre], mid + 1, r, x, v);}
}int query(int rt1, int rt2, int l, int r, int L, int R) {if (l >= L && r <= R) {return sum[rt2] - sum[rt1];}int mid = l + r >> 1, ans = 0;if (L <= mid) {ans += query(ls[rt1], ls[rt2], l, mid, L, R);}if (R > mid) {ans += query(rs[rt1], rs[rt2], mid + 1, r, L, R);}return ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d", &n);for (int i = 1, ls, rs, v; i <= n; i++) {scanf("%d %d %d", &ls, &rs, &v);minn[i] = maxn[i] = v;a[++tot] = v;if (ls) {add(i, ls);}if (rs) {add(i, rs);}}scanf("%d", &m);for (int i = 1; i <= m; i++) {scanf("%d %d", &l[i], &r[i]);a[++tot] = l[i], a[++tot] = r[i];}sort(a + 1, a + 1 + tot);tot = unique(a + 1, a + 1 + tot) - (a + 1);for (int i = 1; i <= n; i++) {minn[i] = maxn[i] = lower_bound(a + 1, a + 1 + tot, maxn[i]) - a;}for (int i = 1; i <= m; i++) {l[i] = lower_bound(a + 1, a + 1 + tot, l[i]) - a;r[i] = lower_bound(a + 1, a + 1 + tot, r[i]) - a;}dfs(1, 0);for (int i = 1; i <= n; i++) {st[++cnt1] = minn[i], ed[++cnt2] = maxn[i];vt[minn[i]].push_back(maxn[i]);}sort(st + 1, st + 1 + cnt1), sort(ed + 1, ed + 1 + cnt2);for (int i = 1; i <= tot; i++) {root[i] = root[i - 1];for (auto it : vt[i]) {update(root[i], root[i], 1, tot, it, 1);}}for (int i = 1; i <= m; i++) {int ans = n;ans -= (lower_bound(ed + 1, ed + 1 + cnt2, l[i]) - ed) - 1;ans -= cnt1 - (upper_bound(st + 1, st + 1 + cnt1, r[i]) - st) + 1;ans -= query(root[l[i] - 1], root[r[i]], 1, tot, l[i], r[i]);printf("%d\n", 2 * ans + 1);}return 0;
}

L - Lookup Performance(主席树)相关推荐

  1. HDU - 6601 Keen On Everything But Triangle(主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,再给出 q 次询问,每次询问给出一个区间 [ l , r ] ,要求从区间内选出三个数,使得构成的三角形周长最大,如果无解输出 - 1 ...

  2. 线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)

    文章目录 Rmq Problem / mex Boring Queries Colorful Squares Rmq Problem / mex luogu4137 对aia_iai​建权值线段树 再 ...

  3. 【UNR #6 C】稳健型选手(分治)(主席树)(二分)

    稳健型选手 题目链接:UNR #6 C 题目大意 有一排卡牌,然后每次询问一个区间,问先手最多的分数. 玩法是先手后手轮流选一张牌拿走,先手任选,后手一定会选最左边的. 然后分数是拿的牌的分数和. 思 ...

  4. 牛客多校第九场 H Cutting Bamboos —— 主席树

    题目链接:点我啊╭(╯^╰)╮ 题目大意: 给你一片竹林,编号 1 1 1 到 n n n ,给定初始高度     每次查询区间,问一共砍 y y y 刀的时候,第 x x x 刀的高度     要求 ...

  5. [决策单调性 分治 主席树] BZOJ 4367 [IOI2014]holiday假期

    比较显然的做法 枚举l,r 然后主席树 这题有很多单调性 可以利用 对一个确定的l 最优的r 是单调的 来分治 #include<cstdio> #include<cstdlib&g ...

  6. hdu 2665(主席树查询区间k大值)

    先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...

  7. P3168 [CQOI2015]任务查询系统 差分+主席树

    链接在这~:https://www.luogu.org/problem/P3168 主席静态区间修改,单点查询 区间(L,R)加1可以通过差分以后转换为L位置加1,R+1位置减1 我们只需要记录一下, ...

  8. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并

    click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...

  9. 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)

    传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...

最新文章

  1. 2021年的第一盆冷水:有人说别太把图神经网络当回事儿
  2. iOS适配问题 键盘变大 整个界面被拉伸
  3. Linux下autoconf和automake使用
  4. 基于容器原理(docker、lxc、cells)的Android 双系统设计概要
  5. 【NLP】Google BERT详解
  6. WOW工会DKP管理系统
  7. 最简单的基于FFmpeg的移动端例子:IOS HelloWorld
  8. LINUX SHELL中echo如何处理特殊字符
  9. office 2010图标出现异常时的解决办法
  10. 计算机系统缺什么安装CAD闪退咋办,怎么处理CAD启动后闪退,求大神级人物解决...
  11. Docker中什么是宿主机?
  12. SQL面试练习题一(基础)
  13. BT通信中数据下载的分析和实现
  14. java 手机号验证_java最新手机号码正则验证方法
  15. 高德地图API 添加标点 自定义标点
  16. 基于皮肤分割的磨皮算法
  17. 如何练胸肌(完整篇)
  18. autoDL租用服务器运行程序全过程
  19. 打造爆款的方法介绍,打造爆款前怎样做店铺基础销量
  20. web远程访问Windows桌面

热门文章

  1. vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...
  2. 服务器的响应一直一直发送不过去,zeroRPC:在发送响应后继续运行进程
  3. 这样子称象你试过没有?
  4. 不可思议!这篇全篇脏话的文章竟然发表了
  5. 美国Thinkfun的“编程三剑客”少儿编程从入门到精通
  6. 入门Python,限时1元!
  7. 请问:如何写出没有BUG的代码?
  8. 这一次,用数据解读玩家行为,用实力拿下预测大奖!
  9. php long2ip,php 中IPV6 ip2long的问题解决办法
  10. seata xid是什么_使用Seata彻底解决Spring Cloud中的分布式事务问题!