*题解:P11364 [NOIP2024] 树上查询

news/2025/11/16 23:08:25/文章来源:https://www.cnblogs.com/yuyc/p/19229299

原题链接

困难题。

解析

考虑处理出形如 \((u,v,d)\) 的三元组表示编号从 \(u\)\(v\) 的点的 LCA 深度为 \(d\),且区间 \([u,v]\) 是极长的。怎么处理呢?肯定要利用子树信息,我们尝试进一步合并子树已经合并出的区间,并将合并出的更大区间记录。由于合并 \(n-1\) 次就变成 \([1,n]\) 了,所以最终处理出的三元组数量是 \(O(n)\) 的。运用启发式合并的思想,对于点 \(x\) 遍历轻儿子所在子树中的结点并尝试扩展其所在区间,看 \(u-1\)\(v + 1\) 是否还在 \(x\) 的子树内,是则合并,合并的过程可以使用并查集来维护。

时间复杂度 \(O(n\log^2 n)\)。(但是貌似有些地方说是单 \(\log\) 的,然后又没有同时写路径压缩和按秩合并,搞不太懂。作者写 \(\log^2\) 是因为懒得写按秩合并。)

然后处理询问,需要讨论询问区间 \([l,r]\) 与三元组区间 \([u,v]\) 的相交情况:

\(u \le l \le r \le v\),则我们希望统计 \((u,v,d)\)\(d\) 的最大值。考虑扫描线,从左往右扫,遇到 \(u\) 就在 \(v\) 位置上做出 \(d\) 的贡献,遇到 \(l\) 就对区间 \([r,n]\) 取最大值,可以使用线段树来维护。

\(l \le u \le r \le v\),则此时有额外限制 \(r - u + 1 \ge k\)。由于每次询问的 \(k\) 不一样,考虑对 \(k\) 从大到小做扫描线。对于每个 \(k\),加入所有区间长度为 \(k\) 的三元组,在 \(u\) 处做 \(d\) 的贡献,对于询问参数为 \(k\) 的询问,只需查询 \([l,r - k + 1]\) 中的最大值,同样可以使用线段树来维护。

\(u \le l \le v \le r\),则此时有额外限制 \(v - l + 1 \ge k\)。处理方法同上,最终是在 \(v\) 处作贡献,查询 \([l + k - 1,r]\) 中的最大值。

\(l \le u \le v \le r\),则可以发现这种情况被包含在第二第三种情况中了,且不影响正确性。

这部分的时间复杂度是 \(O(n \log n)\)

代码

#include <bits/stdc++.h>
#define ls(p) ((p) << 1)
#define rs(p) (((p) << 1) | 1)
#define mid ((l + r) >> 1)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 5e5 + 5,M = 5e5,mod = 998244353;
vector<int> t[N];
int dep[N],dfn[N],siz[N],son[N];
int res[N];
int cnt = 0;
struct Seg{int l = 0,r = 0,d = 0;Seg(){}Seg(int _l,int _r,int _d) : l(_l),r(_r),d(_d){}friend bool operator < (Seg a,Seg b){return a.l < b.l;}
};
vector<Seg> s,len[N],lf[N];
struct Query{int l,r,k,id;
};
vector<Query> q1[N],q2[N];
struct SMT{int mx[N << 2];SMT(){memset(mx,0,sizeof(mx));}void push_up(int p){mx[p] = max(mx[ls(p)],mx[rs(p)]);}void modi(int p,int l,int r,int k,int x){if(l > k || r < k) return;if(l == r){mx[p] = max(mx[p],x);return;}modi(ls(p),l,mid,k,x),modi(rs(p),mid + 1,r,k,x);push_up(p);}int ask(int p,int l,int r,int L,int R){if(l > R || r < L) return 0;if(l >= L && r <= R){return mx[p];}return max(ask(ls(p),l,mid,L,R),ask(rs(p),mid + 1,r,L,R));}
}t1,t2,t3;
void dfs(int x,int fa){dep[x] = dep[fa] + 1;dfn[x] = ++cnt;siz[x] = 1;for(int nx : t[x])if(nx != fa){dfs(nx,x);siz[x] += siz[nx]; if(siz[son[x]] < siz[nx]) son[x] = nx;}
}
int ft[N],bk[N];
int find(int x,int f[]){if(f[x] != x) f[x] = find(f[x],f);return f[x];
}void merge(int x,int u){int fnt = find(x,ft),bck = find(x,bk);bool f = false;while(dfn[fnt - 1] >= dfn[u] && dfn[fnt - 1] <= dfn[u] + siz[u] - 1){ft[fnt] = find(fnt - 1,ft);fnt = ft[fnt];bk[fnt] = bck;f = true;}while(dfn[bck + 1] >= dfn[u] && dfn[bck + 1] <= dfn[u] + siz[u] - 1){bk[bck] = find(bck + 1,bk);bck = bk[bck];	ft[bck] = fnt;f = true;}if(f){s.push_back({fnt,bck,dep[u]});len[bck - fnt + 1].push_back({fnt,bck,dep[u]});lf[fnt].push_back({fnt,bck,dep[u]});}
}
void sol(int x,int fa,int u){for(int nx : t[x])if(nx != fa){sol(nx,x,u);}merge(x,u);
}
void dfs2(int x,int fa){for(int nx : t[x])if(nx != fa){dfs2(nx,x);}for(int nx : t[x])if(nx != fa && nx != son[x]){sol(nx,x,x);}merge(x,x);len[1].push_back({x,x,dep[x]});lf[x].push_back({x,x,dep[x]});
}
int read(){int a = 1,x = 0;char ch = getchar();while(ch > '9' || ch < '0'){if(ch == '-') a = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar(); }return a * x;
} 
int main(){ios::sync_with_stdio(false);cin.tie(0);
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);int n,q;n = read();for(int i=1;i<=n;i++){ft[i] = bk[i] = i;} for(int i=1;i<n;i++){int u,v;u = read(),v = read();t[u].push_back(v);t[v].push_back(u);} dfs(1,0);dfs2(1,0);q = read();for(int i=1;i<=q;i++){int l,r,k;l = read(),r = read(),k = read();q1[l].push_back((Query){l,r,k,i});q2[k].push_back((Query){l,r,k,i});}for(int i=1;i<=n;i++){for(Seg x : lf[i]){t1.modi(1,1,n,x.r,x.d);}for(Query x : q1[i]){res[x.id] = max(res[x.id],t1.ask(1,1,n,x.r,n));}}for(int i=n;i>=1;i--){for(Seg x : len[i]){t2.modi(1,1,n,x.l,x.d);t3.modi(1,1,n,x.r,x.d);}for(Query x : q2[i]){res[x.id] = max({res[x.id],t2.ask(1,1,n,x.l,x.r - i + 1),t3.ask(1,1,n,x.l + i - 1,x.r)});}}for(int i=1;i<=q;i++){cout<<res[i]<<'\n';}return 0;
}

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

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

相关文章

oj第一题python解法

用pyhon实现自动识别输入截止功能 一、 序言与题目引入 对于新接触编程语言如python和c的新同学来说,学校的oj平台上有很好配套练习,既有一定难度,又不会像LeetCode等程序员公用的成熟平台那样太难上手,不过学长学…

11.16方法

11.16方法 1. 方法 是什么? 方法(method)是程序中最小的执行单元 有什么用? 重复的代码、具有独立功能的代码可以抽取到方法中。方法可以提高代码的复用性、可以提高代码的可维护性 2.方法的格式 方法就是把一些代…

基于Tcl命令的HyperView截图

准备工作 Tcl/Tk 命令可以实现 HyperWorks 的中更底层的操作和其他高级功能。应当注意在 HyperMesh 中不支持 Tcl 命令,必须在 HyperMesh Desktop 或 HyperWorks 中使用。不过 HyperView 似乎就直接是在 HyperWorks 环…

2025 年 11 月智能吉他厂家推荐排行榜,无弦吉他,自动档吉他,伴奏吉他,MIDI吉他,创新科技与便捷演奏体验之选

2025 年 11 月智能吉他厂家推荐排行榜,无弦吉他,自动档吉他,伴奏吉他,MIDI吉他,创新科技与便捷演奏体验之选 随着数字音乐技术的快速发展,智能乐器领域迎来了革命性突破。无弦吉他、智能吉他、自动档吉他、伴奏吉…

团队作业3——需求改进与系统设计

团队作业3——需求改进与系统设计团队作业3——需求改进与系统设计这个作业属于哪个课程 计科23级12班这个作业要求在哪里 团队作业3——需求改进与系统设计这个作业的目标 需求与原型改进、系统设计、Alpha阶段任务分…

完整教程:Redis(69)Redis分布式锁的优点和缺点是什么?

完整教程:Redis(69)Redis分布式锁的优点和缺点是什么?2025-11-16 23:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important…

2025 年 11 月 Q355B/Q345B/16Mn 方钢厂家推荐排行榜,低合金高强度方钢,结构用方钢,建筑用方钢公司推荐

2025 年 11 月 Q355B/Q345B/16Mn 方钢厂家推荐排行榜 在建筑、机械制造和基础设施建设领域,Q355B、Q345B 和 16Mn 方钢作为低合金高强度结构钢材,凭借其优异的力学性能和焊接特性,成为关键承重构件和机械部件的首选…

2025 年 11 月精密仪器厂家推荐排行榜,触摸仪表,手表锁具,测试针,医疗传感器,Pogopin声学弹簧公司精选

2025 年 11 月精密仪器厂家推荐排行榜,触摸仪表,手表锁具,测试针,医疗传感器,Pogopin声学弹簧公司精选 随着工业4.0和智能制造的深入推进,精密仪器行业正迎来技术升级与市场需求的双重驱动。精密仪器作为工业生产…

MySQL 数据库核心操作全解析:从创建到备份与连接管理 - 详解

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

evalscope使用2-使用自定义数据集压测

使用evalscope进行大模型测试-使用自定义数据集进行压测 使用自定义数据集进行压测,需要定义模板、提示词数据集、自定义数据集插件,命令行中指定--dateset参数为custom 1、evalscope命令,其中指定dataset为cust…

2025 年 11 月摩托车/机车厂家推荐排行榜:街车、跑车、巡航机车、越野摩托车品牌实力与市场口碑深度解析

2025 年 11 月摩托车/机车厂家推荐排行榜:街车、跑车、巡航机车、越野摩托车品牌实力与市场口碑深度解析 行业背景与发展趋势 摩托车产业作为现代交通工具领域的重要组成部分,近年来呈现出多元化、专业化的发展态势。…

20232402 2025-2026-1 《网络与系统攻防技术》实验五实验报告

20232402 2025-2026-1 《网络与系统攻防技术》实验五实验报告 1.实验内容 1.1 域名与IP信息查询 用whois、dig、nslookup、traceroute/tracert及在线工具查询baidu.com,获取DNS注册人及联系方式,域名对应IP地址,IP注…

2025 年 11 月热轧方钢/扁钢厂家推荐排行榜,方钢,扁钢,热轧方钢,热轧扁钢,优质钢材生产公司推荐

2025年11月热轧方钢/扁钢厂家推荐排行榜 行业背景与发展现状 热轧方钢和扁钢作为基础金属材料,在建筑结构、机械制造、轨道交通等领域具有广泛应用。随着我国制造业转型升级的深入推进,对热轧钢材的尺寸精度、表面质…

2025 年 11 月冷拉/冷拔六角钢厂家推荐排行榜,冷拉六角钢,冷拔六角钢,精密冷拉六角钢,高强度六角钢公司推荐

2025年11月冷拉/冷拔六角钢厂家推荐排行榜 行业背景分析 冷拉/冷拔六角钢作为重要的工业基础材料,在机械制造、汽车工业、电梯制造等领域发挥着关键作用。随着制造业向高质量方向发展,市场对冷拉六角钢、冷拔六角钢的…

2025 年 11 月氢氧化镁厂家推荐排行榜,矿石氢氧化镁,水镁石氢氧化镁,阻燃剂氢氧化镁,改性氢氧化镁公司推荐

2025年11月氢氧化镁厂家推荐排行榜:矿石氢氧化镁、水镁石氢氧化镁、阻燃剂氢氧化镁、改性氢氧化镁公司推荐 行业背景与发展现状 氢氧化镁作为一种重要的无机化工产品,在阻燃材料、环保处理、医药制备等领域具有广泛应…

3种决策树算法

这是一个经典的西瓜数据集,让我们来求它的信息增益(ID3决策树算法)、决策树、信息增益率(C4.5决策树算法)、基尼指数【信息增益】(ID3算法) 记住两个量"信息熵"和"信息增益" [信息熵]表示信…

(Kotlin高级特性三)Kotlin密封类(Sealed Class)在何时比枚举更适用? - 指南

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

2025 年 11 月冷拉/冷拔扁钢厂家推荐排行榜,冷拉扁钢,冷拔扁钢,精密冷拉扁钢,高强度冷拔扁钢公司推荐

2025年11月冷拉/冷拔扁钢厂家推荐排行榜 行业背景分析 冷拉/冷拔扁钢作为现代制造业的重要基础材料,在机械制造、汽车工业、电梯制造等领域发挥着关键作用。随着我国制造业向高质量发展转型,对冷拉扁钢、冷拔扁钢等精…

20232309 2025-2026-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1学习内容几类信息搜集的方向 各类强大的信息搜集相关工具 网络踩点流程 网络扫描方式1.2实验任务从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系…

20232421 2025-2026-1 《网络与系统攻防技术》实验五实验报告

1.实践内容从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理位置 PS:使用whois…