L - Lookup Performance(主席树)
L - Lookup Performance
问对于一颗二叉搜索树来说,如果我们要找一个值域区间的值有多少个,他会向下递归查找几次,
设,第iii个节点所代表的最大最小值为li,ril_i, r_ili,ri,此时我们要查询L,RL, RL,R之间的值有多少个,
- 如果L≤li≤ri≤RL \leq l_i \leq r_i \leq RL≤li≤ri≤R,那么我们不会递归下去查询,意味着当访问完这个点后不会对答案产生新的贡献。
- 如果ri<Lorli>Rr_i < L \ or\ l_i > Rri<L or li>R,同样的,访问完这个点后我们不会递归查询下去,意味着当访问完这个点后不会对答案产生新的贡献。
可以看作有多少条线段与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(主席树)相关推荐
- HDU - 6601 Keen On Everything But Triangle(主席树)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,再给出 q 次询问,每次询问给出一个区间 [ l , r ] ,要求从区间内选出三个数,使得构成的三角形周长最大,如果无解输出 - 1 ...
- 线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)
文章目录 Rmq Problem / mex Boring Queries Colorful Squares Rmq Problem / mex luogu4137 对aia_iai建权值线段树 再 ...
- 【UNR #6 C】稳健型选手(分治)(主席树)(二分)
稳健型选手 题目链接:UNR #6 C 题目大意 有一排卡牌,然后每次询问一个区间,问先手最多的分数. 玩法是先手后手轮流选一张牌拿走,先手任选,后手一定会选最左边的. 然后分数是拿的牌的分数和. 思 ...
- 牛客多校第九场 H Cutting Bamboos —— 主席树
题目链接:点我啊╭(╯^╰)╮ 题目大意: 给你一片竹林,编号 1 1 1 到 n n n ,给定初始高度 每次查询区间,问一共砍 y y y 刀的时候,第 x x x 刀的高度 要求 ...
- [决策单调性 分治 主席树] BZOJ 4367 [IOI2014]holiday假期
比较显然的做法 枚举l,r 然后主席树 这题有很多单调性 可以利用 对一个确定的l 最优的r 是单调的 来分治 #include<cstdio> #include<cstdlib&g ...
- hdu 2665(主席树查询区间k大值)
先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...
- P3168 [CQOI2015]任务查询系统 差分+主席树
链接在这~:https://www.luogu.org/problem/P3168 主席静态区间修改,单点查询 区间(L,R)加1可以通过差分以后转换为L位置加1,R+1位置减1 我们只需要记录一下, ...
- 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并
click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...
- 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)
传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...
最新文章
- 2021年的第一盆冷水:有人说别太把图神经网络当回事儿
- iOS适配问题 键盘变大 整个界面被拉伸
- Linux下autoconf和automake使用
- 基于容器原理(docker、lxc、cells)的Android 双系统设计概要
- 【NLP】Google BERT详解
- WOW工会DKP管理系统
- 最简单的基于FFmpeg的移动端例子:IOS HelloWorld
- LINUX SHELL中echo如何处理特殊字符
- office 2010图标出现异常时的解决办法
- 计算机系统缺什么安装CAD闪退咋办,怎么处理CAD启动后闪退,求大神级人物解决...
- Docker中什么是宿主机?
- SQL面试练习题一(基础)
- BT通信中数据下载的分析和实现
- java 手机号验证_java最新手机号码正则验证方法
- 高德地图API 添加标点 自定义标点
- 基于皮肤分割的磨皮算法
- 如何练胸肌(完整篇)
- autoDL租用服务器运行程序全过程
- 打造爆款的方法介绍,打造爆款前怎样做店铺基础销量
- web远程访问Windows桌面
热门文章
- vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...
- 服务器的响应一直一直发送不过去,zeroRPC:在发送响应后继续运行进程
- 这样子称象你试过没有?
- 不可思议!这篇全篇脏话的文章竟然发表了
- 美国Thinkfun的“编程三剑客”少儿编程从入门到精通
- 入门Python,限时1元!
- 请问:如何写出没有BUG的代码?
- 这一次,用数据解读玩家行为,用实力拿下预测大奖!
- php long2ip,php 中IPV6 ip2long的问题解决办法
- seata xid是什么_使用Seata彻底解决Spring Cloud中的分布式事务问题!