SPOJ COT Count on a tree 主席树

题意:

\(n(1 \leq n \leq 10^5)\)一棵树,每个点有个权值。
还有\(m(1 \leq m \leq 10^5)\)个询问:
\(u \, v \, k\),查询路径\(u \to v\)上权值第\(k\)小的权值。

分析:

和普通的区间一样,对于树维护到根节点的路径信息,父亲节点代表的树就是它的前一棵树。
查询的时候还要求出\(LCA(u,v)\),路径上的点数就是:

  • \(u\)到根的个数+\(v\)到根的个数-\(lca\)到根的个数\(\times 2\)

如果\(lca\)的权值也在统计范围内,统计个数再加\(1\)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int maxn = 100000 + 10;struct Edge
{int v, nxt;Edge() {}Edge(int v, int nxt): v(v), nxt(nxt) {}
};int head[maxn], ecnt;
Edge edges[maxn * 2];void AddEdge(int u, int v) {edges[ecnt] = Edge(v, head[u]);head[u] = ecnt++;
}int fa[maxn], L[maxn];void dfs(int u) {for(int i = head[u]; ~i; i = edges[i].nxt) {int v = edges[i].v;if(v == fa[u]) continue;fa[v] = u;L[v] = L[u] + 1;dfs(v);}
}int n, m;int anc[maxn][20];void preprocess() {memset(anc, 0, sizeof(anc));for(int i = 1; i <= n; i++) anc[i][0] = fa[i];for(int j = 1; (1 << j) < n; j++)for(int i = 1; i <= n; i++) if(anc[i][j-1])anc[i][j] = anc[anc[i][j-1]][j-1];
}int LCA(int u, int v) {if(L[u] < L[v]) swap(u, v);int log;for(log = 0; (1 << log) < L[u]; log++);for(int i = log; i >= 0; i--)if(L[u] - (1<<i) >= L[v]) u = anc[u][i];if(u == v) return u;for(int i = log; i >= 0; i--)if(anc[u][i] && anc[u][i] != anc[v][i])u = anc[u][i], v = anc[v][i];return fa[u];
}int a[maxn], b[maxn], tot;struct Node
{int lch, rch, sum;
};int sz;
Node T[maxn << 5];
int root[maxn];int newnode() {sz++;T[sz].lch = T[sz].rch = T[sz].sum = 0;return sz;
}int update(int pre, int L, int R, int p) {int rt = newnode();T[rt].lch = T[pre].lch;T[rt].rch = T[pre].rch;T[rt].sum = T[pre].sum + 1;if(L == R) return rt;int M = (L + R) / 2;if(p <= M) T[rt].lch = update(T[pre].lch, L, M, p);else T[rt].rch = update(T[pre].rch, M+1, R, p);return rt;
}void dfs2(int u) {root[u] = update(root[fa[u]], 1, tot, a[u]);for(int i = head[u]; ~i; i = edges[i].nxt) {int v = edges[i].v;if(v == fa[u]) continue;dfs2(v);}
}int tmp;int query(int u, int v, int l, int L, int R, int k) {if(L == R) return L;int M = (L + R) / 2;int sum = T[T[u].lch].sum + T[T[v].lch].sum - T[T[l].lch].sum * 2;if(L <= tmp && tmp <= M) sum++;if(sum >= k) return query(T[u].lch, T[v].lch, T[l].lch, L, M, k);else return query(T[u].rch, T[v].rch, T[l].rch, M+1, R, k - sum);
}int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++) {scanf("%d", a + i);b[i] = a[i];}ecnt = 0;memset(head, -1, sizeof(head));for(int i = 1; i < n; i++) {int u, v; scanf("%d%d", &u, &v);AddEdge(u, v); AddEdge(v, u);}dfs(1);preprocess();sort(b + 1, b + 1 + n);tot = unique(b + 1, b + 1 + n) - b - 1;for(int i = 1; i <= n; i++)a[i] = lower_bound(b + 1, b + 1 + tot, a[i]) - b;dfs2(1);while(m--) {int u, v, k; scanf("%d%d%d", &u, &v, &k);int lca = LCA(u, v);tmp = a[lca];int ans = query(root[u], root[v], root[lca], 1, tot, k);printf("%d\n", b[ans]);}return 0;
}

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/5285890.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 2296. 设计一个文本编辑器(双栈)

文章目录1. 题目2. 解题1. 题目 请你设计一个带光标的文本编辑器&#xff0c;它可以实现以下功能&#xff1a; 添加&#xff1a;在光标所在处添加文本。删除&#xff1a;在光标所在处删除文本&#xff08;模拟键盘的删除键&#xff09;。移动&#xff1a;将光标往左或者往右移…

五、scrapy爬虫框架——logging 模块的使用

logging 模块的使用 1、scrapy settings中设置LOG_LEVEL“WARNING”settings中设置LOG_FILE"./a.log"#设置日志保存的位置&#xff0c;设置会后终端不会显示日志内容import logging,实例化logger的方式在任何文件中使用logger输出内容 2、普通项目中 import logg…

CUBRID学习笔记 22 插入数据

CREATE TABLE auto_tbl(id INT AUTO_INCREMENT, name VARCHAR);自增长的列可以插入null, 同时一次可以插入多条记录.别的和其他的sql数据库语法基本一样 INSERT INTO auto_tbl VALUES (NULL, AAA); INSERT INTO auto_tbl (id, name) VALUES (NULL, AAA); INSERT INTO auto_tbl …

PyQt5 布局管理(水平、垂直、网格、表单、嵌套、QSplitter)

文章目录1. 布局管理2. 使用绝对位置布局3. QBoxLayoutaddStretch() 添加可伸缩控件4. QGridLayout5. QFormLayout6. 嵌套布局7. QSplitter 布局learn from 《PyQt5 快速开发与实战》 https://doc.qt.io/qtforpython/index.html https://www.riverbankcomputing.com/static/Doc…

一、Java 面向对象高级——Object类、常用API

day01【Object类、常用API】 主要内容 Object类Date类DateFormat类Calendar类System类StringBuilder类包装类 教学目标 -[ ] 能够说出Object类的特点 -[ ] 能够重写Object类的toString方法 -[ ] 能够重写Object类的equals方法 -[ ] 能够使用日期类输出当前日期 -[ ] 能够使…

FineUI(专业版)v3.0.0 发布,手机、平板和桌面全支持!

FineUI&#xff08;专业版&#xff09;v3.0.0 已经正式发布&#xff0c;全面支持手机、平板和桌面&#xff01;自 2008 年 4 月发布第一个版本&#xff0c;我们持续更新了 126 个版本&#xff0c;拥有 16000 多位注册用户&#xff0c;1300 多位捐赠会员&#xff0c;200 多位网友…

二、Java 面向对象高级——Collection、泛型

day02【Collection、泛型】 主要内容 Collection集合迭代器增强for泛型 教学目标 能够说出集合与数组的区别 说出Collection集合的常用功能 能够使用迭代器对集合进行取元素 能够说出集合的使用细节 能够使用集合存储自定义类型 能够使用foreach循环遍历集合 能够使用泛型定…

LeetCode 2299. 强密码检验器 II

文章目录1. 题目2. 解题1. 题目 如果一个密码满足以下所有条件&#xff0c;我们称它是一个 强 密码&#xff1a; 它有至少 8 个字符。至少包含 一个小写英文 字母。至少包含 一个大写英文 字母。至少包含 一个数字 。至少包含 一个特殊字符 。特殊字符为&#xff1a;"!#…

Spring中RedirectAttributes对象重定向传参

Spring3中的FlashAttribute 为 了防止用户刷新重复提交&#xff0c;save操作之后一般会redirect到另一个页面&#xff0c;同时带点操作成功的提示信息。因为是Redirect&#xff0c;Request里 的attribute不会传递过去&#xff0c;如果放在session中&#xff0c;则需要在显示后及…

LeetCode 2300. 咒语和药水的成功对数(二分查找)

文章目录1. 题目2. 解题1. 题目 给你两个正整数数组 spells 和 potions &#xff0c;长度分别为 n 和 m &#xff0c;其中 spells[i] 表示第 i 个咒语的能量强度&#xff0c;potions[j] 表示第 j 瓶药水的能量强度。 同时给你一个整数 success 。一个咒语和药水的能量强度 相…

三、Java 面向对象高级——数据结构、List、Set、Collection

day03 【List、Set、数据结构、Collections】 主要内容 数据结构List集合Set集合Collections 教学目标 能够说出List集合特点 能够说出常见的数据结构 能够说出数组结构特点 能够说出栈结构特点 能够说出队列结构特点 能够说出单向链表结构特点 能够说出Set集合的特点 能够说…

Centos Cacti 0.8.8g

Centos Cacti 0.8.8g 一、Cacti简介1. cacti是用php语言实现的一个软件&#xff0c;它的主要功能是用snmp服务获取数据&#xff0c;然后用rrdtool储存和更新数据&#xff0c;当用户需要查看数据的时候用rrdtool生成图表呈现给用户。因此snmp和rrdtool是cacti的关键。Snmp关系着…

LeetCode 2301. 替换字符后匹配(字典)

文章目录1. 题目2. 解题1. 题目 给你两个字符串 s 和 sub 。同时给你一个二维字符数组 mappings &#xff0c;其中 mappings[i] [oldi, newi] 表示你可以替换 sub 中任意数目的 oldi 字符&#xff0c;替换成 newi 。sub 中每个字符 不能 被替换超过一次。 如果使用 mappings…

一、Web服务器——Tomcat Servlet学习笔记

今日内容 web相关概念回顾web服务器软件&#xff1a;TomcatServlet入门学习 一、web相关概念回顾 软件架构 C/S&#xff1a;客户端/服务器端B/S&#xff1a;浏览器/服务器端 资源分类 静态资源&#xff1a;所有用户访问后&#xff0c;得到的结果都是一样的&#xff0c;称为静态…

LeetCode 2302. 统计得分小于 K 的子数组数目(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 一个数组的 分数 定义为数组之和 乘以 数组的长度。 比方说&#xff0c;[1, 2, 3, 4, 5] 的分数为 (1 2 3 4 5) * 5 75 。 给你一个正整数数组 nums 和一个整数 k &#xff0c;请你返回 nums 中分数 严格小于 k 的 非空整数子数组数目。 …

《MySchool数据库设计优化》内部测试

1) 在SQL Server 中&#xff0c;为数据库表建立索引能够&#xff08; C &#xff09;。 A. 防止非法的删除操作 B. 防止非法的插入操作 C. 提高查询性能 D. 节约数据库的磁盘空间 解析&#xff1a;索引的作用是通过使用索引&#xff0c;大大提高数据库的检索速度&#xff0c;改…

二、Web服务器——ServletHTTPRequest笔记

今日内容&#xff1a; 1. Servlet 2. HTTP协议 3. RequestServlet&#xff1a; 1. 概念 2. 步骤 3. 执行原理 4. 生命周期 5. Servlet3.0 注解配置 6. Servlet的体系结构 Servlet -- 接口|GenericServlet -- 抽象类|HttpServlet -- 抽象类* GenericServlet&#xff1a;将Ser…

LeetCode 2303. 计算应缴税款总额

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的二维整数数组 brackets &#xff0c;其中 brackets[i] [upperi, percenti] &#xff0c;表示第 i 个税级的上限是 upperi &#xff0c;征收的税率为 percenti 。税级按上限 从低到高排序&#xff08;在满足 0 < i &…

Mysql中常用的函数汇总

Mysql中常用的函数汇总&#xff1a; 一、数学函数abs(x) 返回x的绝对值bin(x) 返回x的二进制&#xff08;oct返回八进制&#xff0c;hex返回十六进制&#xff09;ceiling(x) 返回大于x的最小整数值exp(x) 返回值e&#xff08;自然对数的底&#xff09;的x次方floor(x) 返回小于…

一、Java Web——JDBC快速入门(详解)

今日内容 1. JDBC基本概念 2. 快速入门 3. 对JDBC中各个接口和类详解JDBC&#xff1a; 概念&#xff1a;Java DataBase Connectivity Java 数据库连接&#xff0c; Java语言操作数据库 * JDBC本质&#xff1a;其实是官方&#xff08;sun公司&#xff09;定义的一套操作所有关系…