浅记树分块

news/2025/11/19 21:22:40/文章来源:https://www.cnblogs.com/he-qwq/p/19244088

其实我觉得以我的水平考场大概率用不出来树分块,但由于它太难写了,所以我还是写一下

树分块,顾名思义,和序列分块一样,把树也分成很多块,然后就可以根号复杂度处理一些问题,具体地,我们选\(\sqrt{n}\)个点,使得每个点的距离尽量为\(\sqrt{n}\),记录每个块往上一个块是哪里,处理询问时和序列分块一样,散块就暴力往父节点跳,整块则直接跳到上一个块,复杂度是正确的。

具体地,我们先把所有叶子节点选上,然后网上递归的时候判断子树内标记点距离当前点距离是否大于\(len\),如果大于就将当前点标记,讲未标记点分入块内时,为了保证块是链状结构,我们将两个标记点间的点全归到下方标记点代表的块内,即
无标题4

(有数字的点为关键点)

考虑此题怎么做,首先看到颜色个数问题考虑维护值域01串,想到离散化后使用bitset维护每个块的答案,但由于bitset合并(块答案合并)复杂度是\(\frac{n}{w}\),如果每次询问时处理整块间答案,复杂度变成了\(O(\frac{qn}{w}\sqrt{n})\),显然这样会炸,但提前预处理复杂度就变成了\(\frac{n^{2}}{w}\),所以此题需要提前预处理

下面是一段加了很多注释的代码(因为怕被卡用的dfs序\(O(1)\)求lca)

点击查看代码
#include<bits/stdc++.h>
#define pb push_back
#define vt vector<int>
#define ll long long
#define pp pair<int,node>
#define N 40005
#define V 1000000
#define ull unsigned long long
#define se second
#define fi first
#define mk make_pair
#define lw(x) (x&(-x))
#define ls x<<1
#define rs x<<1|1
using namespace std;
const int Maxn=(1<<20);
const ll Minn=1e3;
const ll M=1e9+7;
const int inf=2e9+10;
const ll INF=1e18;
ll qm(ll x,ll y=M-2) {ll res=1;for(;y;x=x*x%M,y/=2) if(y&1) res=res*x%M;return res;
}
ll Mi(ll x,ll y) { return (x<y)?x:y; }
pair<ll,int> Mk(pair<ll,int> x,pair<ll,int> y) { return (x>y)?x:y; }
ll pw(ll x) { return x*x; }
void add(ll &x,ll y) { if((x+=y)>=M) x-=M; }
void add(ll &x,ll y,ll z) { x=(x+y*z%M)%M; }
void del(ll &x,ll y) { if((x-=y)<0) x+=M; }
inline int read() {char ch=getchar();int x=0,f=1;while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;
}
int n,m,md[N],w[N],ww[N],len,dep[N],st[N],tot,idx,dfn[N],ct,qu[N<<1],lg[N<<1],dp[N<<1][22],Fa[N],fa[N],id[N];
vector<int> a[N];
bitset<N> bt[50][50],now;
void dfs(int x) {dfn[x]=++ct;qu[ct]=x;md[x]=dep[x]; //最近的关键点for(auto v:a[x]) {if(dep[v]) continue;dep[v]=dep[x]+1;fa[v]=x;dfs(v);qu[++ct]=x; //这里是st表求lcaif(md[v]>md[x]) md[x]=md[v];} if(md[x]-dep[x]>=len) id[x]=++idx,md[x]=dep[x]; //关键点
}
void dfs1(int x) {for(auto v:a[x]) {if(v==fa[x]) continue; if(id[v]) {int p=id[st[tot]],in=id[v];for(int i=v;i!=st[tot];i=fa[i]) bt[p][in].set(w[i]); //上一个关键点到这一个关键点(即块内)答案now=bt[p][in];for(int i=1;i<tot;i++) bt[id[st[i]]][in]=bt[id[st[i]]][p]|now; //祖先所有关键点到这个关键点答案Fa[v]=st[tot]; //这个块上一个块st[++tot]=v;} dfs1(v);if(id[v]) --tot;} 
}
void build() { //lcafor(int i=1;i<=ct;i++) dp[i][0]=qu[i];for(int j=1;j<=20;j++) {for(int i=1;i+(1<<j)<=ct;i++) {int f1=dp[i][j-1],f2=dp[i+(1<<j-1)][j-1];dp[i][j]=dep[f1]<dep[f2]?f1:f2;}} lg[0]=-1;for(int i=1;i<=ct;i++) lg[i]=lg[i>>1]+1;
}
int lca(int x,int y) { //lcaif(dfn[x]>dfn[y]) swap(x,y);x=dfn[x];y=dfn[y];int d=lg[y-x+1];int f1=dp[x][d],f2=dp[y-(1<<d)+1][d];return dep[f1]<dep[f2]?f1:f2;
}
void solve() {  cin>>n>>m; int x,y,ans=0;len=1000;for(int i=1;i<=n;i++) cin>>ww[i],w[i]=ww[i];int nn=unique(ww+1,ww+n+1)-ww-1;sort(ww+1,ww+nn+1);for(int i=1;i<=n;i++) w[i]=lower_bound(ww+1,ww+nn+1,w[i])-ww; //离散化for(int i=1;i<n;i++) {cin>>x>>y;a[x].pb(y);a[y].pb(x);} dep[1]=1;dfs(1);if(!id[1]) id[1]=++idx;st[++tot]=1;dfs1(1);build();while(m--) {int u,v;cin>>u>>v;u=u^ans;int lc=lca(u,v);now.reset();while(u!=lc&&!id[u]) now.set(w[u]),u=fa[u];while(v!=lc&&!id[v]) now.set(w[v]),v=fa[v]; //散块if(u!=lc) {x=u;while(dep[Fa[x]]>=dep[lc]) x=Fa[x];//整块跳if(x!=u) now|=bt[id[x]][id[u]];while(x!=lc) now.set(w[x]),x=fa[x]; } if(v!=lc) {x=v;while(dep[Fa[x]]>=dep[lc]) x=Fa[x];if(x!=v) now|=bt[id[x]][id[v]];while(x!=lc) now.set(w[x]),x=fa[x];} now.set(w[lc]);printf("%d\n",ans=now.count());}
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1,c;while(t--) { solve(); }return 0;
}

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

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

相关文章

XPath表达式解析与应用

本篇内容来自AI的解读,用于后续温习回顾xpath的使用$x("//div[@class=ec-accordion and (./div[@class=ec-accordion-title and ./span[text()=Prerequisites]])]") 各部分含义:(1) //div - 选择文档中所有…

2025中国防晒品牌榜出炉!按肤质/场景选!

2025中国防晒品牌榜出炉!按肤质/场景选!宝子们!夏天防晒选不对,再贵的护肤品都白费~其实选防晒的核心超简单:看肤质+看场景,没有“万能款”!今天整理了2025年天猫618热卖榜、亚洲皮肤健康联盟口碑榜的权威推荐…

linux ftp使用

在 Linux 系统中,ftp 是一个用于通过 FTP 协议进行文件传输的命令行工具。它通常用于与远程服务器进行交互,例如上传或下载文件。? 一、使用 ftp 的基本命令 1. 连接 FTP 服务器 ftp <hostname><hostname&…

linux ftp代码

在 Linux 系统中,ftp 命令行工具是用于与 FTP 服务器进行交互的常用工具。它本身是一个命令行 FTP 客户端,但需要注意的是,ftp 已在大多数现代 Linux 发行版中被弃用,推荐使用 vsftpd(FTP 服务器)或 lftp(更现代…

linux ftpgt;put

你提到的 ftp>put 是 FTP(File Transfer Protocol) 命令行工具中的一个命令,用于在 FTP 客户端 中上传文件。? 一、ftp 命令行工具简介 ftp 是 Linux/Unix 系统中用于通过 FTP 协议 与远程服务器进行文件传输的…

题解 [YLOI 2019] 棠梨煎雪

题解 [YLOI 2019] 棠梨煎雪原文来自CnBlogs, 作者: young_tea.

2025-11-19

CF Problem - 1418C - Codeforces(dp+贪心好题!)(1500) dp操作,要分开判断先手和后手 #include <bits/stdc++.h> using namespace std; #define LL long long const LL mod = 998244353; const int N=2e5+…

docker 自用手册

问题 用id删除镜像,报错Error response from daemon: No such image: 15e:latest 原因就在于,我也不知道。其他镜像并没有以15e开头,反正不知道为什么。 但是解决办法就是,多输几位ID,实在不行就直接名称删除。我…

Gemini 3发布与小试牛刀

Gemini 3发布与小试牛刀Google Gemini 3 技术范式与生态系统深度研究报告发布日期:2025年11月Gemini 3 架构特性、多模态推理能力、智能体式开发环境(Antigravity)与市场竞争格局分析1. 引言:从对话智能到代理智能…

落山基唬人队 第二次团队作业——原型设计+概要设计

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homework/13559这个作业的目标 原型设计+概…

kilocode_idea端测试

kilo code 4.113.1 大模型 glm4.6 用HTML、CSS和JavaScript(若更偏好p5.js也可选用),创建一个带有动画效果的天气卡片。要在卡片里呈现当前温度、具体位置以及天气状况,像晴天、雨天、多云这些常见天气类型都要覆盖。…

【触想智能】工业一体机在户外使用要注意的问题分享

工业一体机是一种集成了计算机、显示器、触摸屏和其他功能的设备,广泛应用于各种工业领域,包括制造业、物流、交通管理等。由于其强大的性能和可靠性,工业一体机在户外环境中的使用成为一种趋势。触想工业一体机TPC…

#20232329 2025-2026-1 《网络与系统攻防技术》实验八实验报告

#20232329 2025-2026-1 《网络与系统攻防技术》实验八实验报告1.实验内容 1)Web前端HTML:能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 2)Web前端javascipt:理解Jav…

IDEA Debug使用方法

Step over 一行一行往下走 Step into 进入方法内部/force step into Step out 跳出当前类 Run to cursor 跳到当前光标的位置执行 Evaluate Expression 在里面执行任何一个java语句,可以查看当时的状态断点普通行断点…

初级阶段:无法连接虚拟机的故障排查思路

Xshell连接虚拟机线路图无法连接虚拟机的排查思路: 1.首先查看本地网络是否有vmnet8网卡,vmnet8是本地xshell连接到虚拟机的必要网络。 2.然后看vmnet8的IP地址、虚拟机的IP地址、虚拟交换机是否在同一网段 3.如果IP…

完整教程:AI研究-109-具身智能 机器人模型验证SOP流程详解|仿真 现实 回放 模板理论

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

高性能计算实践- 遥遥领先!看看 streaming store 在矩阵转置中有多少提升

说明 本文作为上一篇 矩阵转置 transpose 复现的补充测试。来看看 streaming store 到底什么实力。 性能测试 FORCE_INLINE void transpose_8x8_store_contiguous(const uint8_t* src0, const uint8_t* src1, const ui…

linux ftp 端口查看

在 Linux 系统中,查看 FTP 服务使用的端口通常可以通过以下几种方法实现:方法 1:使用 netstat 命令 sudo netstat -tuln | grep -E 20|21-t: 显示 TCP 端口 -u: 显示 UDP 端口 -l: 显示监听中的端口 -n: 不转换端口…

详细介绍:JavaEE初阶7.0

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AT_arc195_e [ARC195E] Random Tree Distance gemini-3 Pro题解

优化距离计算 我目前专注于核心概念:距离求和。我正在探索高效的方法来计算所有可能的父序列中所有节点对之间的总距离。组合爆炸是一个真正的障碍,但我正在思考巧妙的策略来降低计算复杂度。目标是找到一个公式,而…