树上莫队(伪)

news/2024/11/6 23:18:51/文章来源:https://www.cnblogs.com/Ice-lift/p/18306207

前置:莫队,LCA(太简单了懒得写(bushi))

1. 树 -> 链

用欧拉序将树转化成序列,然后我们可以发现:

  1. \(\text{lca}(u,v) = u\)\(u \to v\) 的路径为 \(in_u\)\(in_v\) 的区间中所有只出现一次的点构成的路径。

  2. \(\text{lca}(u, v) \ne u\)\(u \to v\) 的路径为 \(out_u\)\(in_v\) 的区间中所有只出现一次的点和他们的 \(\text{lca}\)构成的路径。

于是乎,链上信息就转化为了区间信息。好的,莫队启动!

2. 例题

Gym-100962F Frank Sinatra

链上 \(\text{mex}\)

我们知道区间 \(\text{mex}\) 可以用莫队 + 分块做。

然后套树上莫队板子即可。

注意此题为边权,不用考虑 \(\text{lca}\),将边权存到深度较深的节点中即可。

Code
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, m, b;
map<int, int> mp;
int tmp, to[N], a[N];
struct edge {int to, col, nxt;
}e[N * 2];
int h[N], tot;
void add (int u, int v, int w) {e[++ tot] = {v, w, h[u]}, h[u] = tot;
}
int dfn[N], idx, in[N], out[N], ans[N];
int c[N];
void dfs (int u, int fath) {in[u] = ++ idx, dfn[idx] = u;for (int i = h[u]; i; i = e[i].nxt) {int v = e[i].to, col = e[i].col;if(v == fath) continue;c[v] = col + 1;dfs(v, u);}out[u] = ++ idx, dfn[idx] = u;
}
struct ask {int l, r, id;
}q[N];
bool cmp (ask x, ask y) {if((x.l - 1) / b + 1 != (y.l - 1) / b + 1) return x.l < y.l;return x.r < y.r;
}
namespace block {int len, siz, num;int bel[N], le[N], ri[N], cnt[N], hav[N];void init () {siz = 400;for (int i = 1; i <= len; i ++) {bel[i] = (i - 1) / siz + 1, hav[bel[i]] ++;if(bel[i] != bel[i - 1]) le[bel[i]] = i, ri[bel[i] - 1] = i - 1;}num = bel[n], ri[bel[n]] = n;}void add (int x) {if(x > len) return;cnt[x] ++;if(cnt[x] == 0) hav[bel[x]] --;}void del (int x) {if(x > len) return;cnt[x] --;if(cnt[x] == 1) hav[bel[x]] ++;}int getmex () {for (int i = 1; i <= num; i ++){if(hav[i])for (int p = le[i]; p <= ri[i]; p ++)if(!cnt[p]) return p - 1;}return len;}
};
bool vis[N];
void Add (int pos) {int u = dfn[pos];if(!vis[u]) block::add(c[u]);else block::del(c[u]);vis[u] ^= 1;
}signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n >> m;b = sqrt(n * 2);block::len = n + 1, block::init();for (int i = 1; i < n; i ++) {int u, v, col;cin >> u >> v >> col;add(u, v, col), add(v, u, col);}dfs(1, 0);for (int i = 1; i <= m; i ++) {int u, v;cin >> u >> v;if(in[u] > in[v]) swap(u, v);q[i].l = out[u], q[i].r = in[v], q[i].id = i;}sort(q + 1, q + 1 + m, cmp);int l = q[1].l, r = q[1].l - 1;for (int i = 1; i <= m; i ++) {while(l < q[i].l) Add(l ++);while(l > q[i].l) Add(-- l);while(r < q[i].r) Add(++ r);while(r > q[i].r) Add(r --);ans[q[i].id] = block::getmex();}for (int i = 1; i <= m; i ++) cout << ans[i] << endl;return 0;
}

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

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

相关文章

菱形

1/定义在同一平面内,有一组邻边相等的平行四边形是菱形如图,四边形 \(ABCD\) 是一个菱形 2/性质 首先,在平行四边形原有的基础上,菱形还有一些特有的性质:对角线互相垂直 \(\because \text{平行四边形}ABCD\) \(\therefore AO = OC, BO = OD\) \(\because AB = BC\) \(\th…

个人练习前端技术使用Bootstrap、JQuery、thymeleaf

个人练习前端技术使用Bootstrap、JQuery、thymeleaf说明:本代码只是为了本人练习前后端联动技术,包含html,jquery,thymeleaf模板、ajax请求及后端功能联动,方便自己查找及使用。@目录代码场景场景1.table批量查询功能(有默认值),点击"查询最新数据"从后台查询…

uBlocklist屏蔽垃圾搜索结果

近年来特别是 Google 的中文搜索结果体验越来越差,出现了越来越多「不知所谓」的网站,这些网站通过机器翻译、直接复制的方式「拼接」而成一个网站占据了大量的搜索结果,这类网站就是——「内容牧场」。 什么是内容牧场 内容农场(或内容工厂,英文名为 content farm)是指生…

正则表达式如何匹配中文

正则表达式如何匹配中文\w匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下 匹配中文字符的正则表达式:[\u4e00-\u9fa5]或许你也需要匹配双字节字符,所谓“双字节字符”就是长度是两个字节(byte)的字符,比如“嗨”、“!”、“。”,汉字及中文标…

windows下电脑自定义磁盘图标,u盘图标,文件夹图标

闲言 更改图标要确定有ico(icon)格式图片文件, 文件比例1:1, 一般像素大小比例推荐128:128 确保文件后缀有显示目录闲言寻找或制作ico图片直接下载网络图片制作ico文件在线制作本地制作ico磁盘/U盘图标更改文件夹图标更改 寻找或制作ico图片 直接下载网络图片 这里推荐阿里巴巴…

Macbook M1下安装elasticsearch

一、下载安装包(Kibana 的版本需要和 Elasticsearch 的版本一致。这是官方支持的配置。) 地址分别为:ElasticSearch:https://www.elastic.co/cn/downloads/elasticsearch kibana:https://www.elastic.co/cn/downloads/kibana对于Mac M1芯片基于ARM架构应该选择Aarch64(另…

博客园sakura主题只显示每天一篇或者显示不完随笔bug的修复

关于主题只显示每天第一个博文的的bug 问题 在布置sakura博客园主题的时候,发现这个主题只会显示每一天发布的博文中最晚发布的,其他的就不发了,很奇怪。去去翻了这个主题作者的博文也说了有这bug,但由于这个主题一直没更新,所以也一直没修复。因为比较喜欢这个主题,也抱…

element Plus 设置主题背景色

其主要通过给html动态的添加一个dark类。 主要要通过dom获取html标签,然后给html标签设置className 需要在main.ts中引入dark所在的css文件:具体可以参考element Plus的官网

基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率

1.程序功能描述 基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出ACO优化的收敛曲线,规划路径结果和每一条路径的满载率。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序%搜索 for i=1:Iteration iis_best=0; for j=1:Npop%蚂蚁搜索一次Ants …

六自由度Stewart控制系统matlab仿真,带GUI界面

1.课题概述六自由度Stewart平台控制系统是一种高精度、高稳定性的运动模拟装置,广泛应用于飞行模拟、汽车驾驶模拟、虚拟现实、精密定位等领域。其工作原理基于Stewart机构(也称为并联机构)的设计理念,通过六个独立的线性致动器(通常为液压缸或电动推杆)连接固定基座与移…

20241106-语音视频转文字的测试及其价格

一、绘影Ai字幕价格 个人专业版本60元, 商用大约一个120元,支持批量。 二、手机app 讯飞语音、语音转文字等 讯飞听见迅捷转语音 https://www.bilibili.com/read/cv21023516/ 功能 价格 视频、语音转文字的原理 涉及的模型 感悟: 我使用33字幕本地识别,实在太废时间了。我…

javascript模块 (Module) 简介

https://blog.csdn.net/chehec2010/article/details/119804381随着ES6的出现,js模块已经成为正式的标准了。曾经为了解决js模块问题而发展起来的民间秘籍,requireJs(AMD)、SeaJs(CMD)、Node(CommonJs),已经或者不久的将来会成为历史。了解历史也是很重要的,因为正式标准就是…