【LuoguP3348】[ZJOI2016]大森林

这是一篇关于解决ZJOI2016大森林问题的博客,主要讨论如何利用二维空间和扫描线算法来处理区间树木生长、换根等操作,并在换根后正确计算节点间的距离。博主提到了利用虚点连接和后缀换根的方法来高效地实现这些操作。

题目链接

题目描述

小Y家里有一个大森林,里面有n棵树,编号从1到n。一开始这些树都只是树苗,只有一个节点,标号为1。这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力。

小Y掌握了一种魔法,能让第l棵树到第r棵树的生长节点长出一个子节点。同时她还能修改第l棵树到第r棵树的生长节点。她告诉了你她使用魔法的记录,你能不能管理她家的森林,并且回答她的询问呢?

Sol

一脸毒瘤。
区间 l i n k link link 一个叶子 , 显然不能模拟吧…
这种复杂的题显然都是只寻求我们需要知道的信息。
我们只需要知道某棵树里两个点之间的距离就行了。
注意到题目中说了保证 u , v u,v u,v 是存在于要询问的树中的 , 容易发现我们先把树该加的点都加了最后再来询问也是木有关系的。
这样再想一下,每次加叶子的编号是一定的 !! 所以那个什么区间加叶子也是假的 , 我们并不关心我们是否加错了叶子 , 反正不影响询问。 ( O V O ) (OVO) (OVO)
所以我们仅仅需要一棵树。
但是一棵树显然不能同时处理不同树上的询问。
这时就容易发现这是一个二维空间里的问题了 , 以时间和位置为轴把操作写在二维平面上的话 , 就可以用一个扫描线来维护每一个位置上树的形态了并求解每一棵树的询问了。

唯一要考虑的就是换根了。
我们需要换根的话还不就是叶子接错地方了嘛 , 考虑什么情况下我们叶子接错了地方。
首先需要有一个换根操作 , 之后我们接了点叶子在原来的根上 , 就 wa 了。
所以我们要把它们搬运回去。也就是说 , 对于一个区间 [ L , R ] [L,R] [L,R] 的换根操作。
当扫描线到了 L L L 的时候 , 我们需要把时间在此换根操作之后的点从原来的父亲上扯下来连到当前的新的根上 , 也就是后缀换根 … \dots 然后出了这个区间后,也就是在 R + 1 R+1 R+1 的位置 , 我们要把他们又全部插回去。
怎样高效地做到这种奇葩的操作。

我们对于每一个换根操作建立一个虚点 , 把生长操作以及换根操作的(虚)点都直接连到他们时间上的前驱虚点上。(特别的,没有前驱虚点的连在1号点上)
一开始 , 由于所有点都连向了虚点 , 那么如果删去虚点 , 这样就是一个菊花图。
之后 , 按照扫描线的顺序进行操作 , 改换根的就直接把这个虚点换个父亲根 , 要插回去就一样的移动虚点 , 这样不就后缀换根了吗!
要注意的细节地方就是求距离了 , 由于建立了虚点 , 不能直接算距离 , 但是还是可以用 d i s ( u , v ) = d i s ( u , r o o t ) + d i s ( v , r o o t ) − 2 ∗ d i s ( L C A ( u , v ) , r o o t ) dis(u,v)=dis(u,root)+dis(v,root)-2*dis(LCA(u,v),root) dis(u,v)=dis(u,root)+dis(v,root)2dis(LCA(u,v),root)来正确计算距离 , 每次计算前让1号点成为根就行了。

code:

#include<bits/stdc++.h>
using namespace std;
template<class T>inline void init(T&x){
   
   
	x=0;char ch=getchar();bool t=0;
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') t=1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48);
	if(t) x=-x;return;
}
#define ls son[0]
#define rs son[1]
#define __ NULL
#define get_son(a) (a->fa->rs==a)
#define get(a,b,c) (a? a->b:c)
#define IS(a) (a&&(!a->fa||(a->fa->son[get_son(a)]!=a)))
#define ID(a) ((a)-T)
int n,m;
const int N=4e5+
<think> 首先,用户的问题是:“我想查找洛谷P1874题目的测试样例 请问洛谷P1874题目测试样例”。意思是用户想查找洛谷P1874题的测试样例。 从系统指令中,我需要参考提供的引用。引用中有几个洛谷题目的信息: - 引用[1]: P5713 【深基3.例5】洛谷团队系统,关于配置题目的时间比较。 - 引用[2]: P5146 最差值 C语言,讨论排序问题。 - 引用[3]: P1634 和 P1639 题解,关于传送门问题。 - 引用[4]: P5707 【深基2.例12】上学迟到 C语言,包含代码和坑点。 - 引用[5]: P1725 琪露诺,单调队列优化的dp。 用户的问题是关于P1874的测试样例,但这些引用中没有提到P1874。所以,我不能直接从引用中找到答案。 系统指令说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 用户上一次的问题是什么?在对话中没有记录用户之前的问题。第一条消息是系统指令,然后是用户的问题:"我想查找洛谷P1874题目的测试样例..."。所以,没有之前的问题。我应该基于当前的问题回答。 用户的需求是查找洛谷P1874题目的测试样例。但作为AI,我不能直接访问外部网站或数据库;我只能基于提供的知识回答。提供的引用中没有P1874的信息,所以我需要一般性地回答。 可能的思路: - 解释测试样例的含义:测试样例是题目提供的输入输出样例,用于验证程序的正确性。 - 建议用户如何获取:在洛谷网站上查找题目页面,通常会有测试样例部分。 - 或者,如果我熟悉P1874,我可以描述常见的测试样例。但我不确定P1874是什么题目。 回想一下,洛谷P1874是什么题?洛谷是一个在线评测系统,题目编号对应具体问题。P1874可能是“快速排序”或其他题目?用户没说题目内容。 在系统指令的示例中,提到了快速排序,但那只是示例,不是用户的问题。 我应该诚实回答:我没有直接访问测试样例的能力,但可以指导用户如何查找。 结构化回答: 1. 确认用户的问题:用户想找洛谷P1874的测试样例。 2. 解释测试样例:测试样例是题目描述的一部分,包含输入和预期输出,帮助开发者调试。 3. 建议方法:由于引用中没有相关信息,(1) 访问洛谷官方网站,(2) 搜索题目P1874页面,(3) 在题目描述中查找样例输入输出。 4. 如果我知道题目内容,可以提供一般测试样例。但我不确定;假设P1874是一个常见题,但我不能假设。 为了帮助用户,我可以基于通用知识:许多题目有标准测试样例。 或者,检查引用:[^4]中提到了P5707的代码,但没有测试样例。 系统指令要求:"回答中引用的段落末尾自然地添加引用标识",所以如果我引用任何东西,需要添加引用。 但在这,没有相关的引用。 最后,系统指令说:"生成相关问题",所以我需要在回答后添加相关问题。 回答结构: - 澄清问题:洛谷P1874的测试样例。 - 提供信息:测试样例通常包括输入示例和输出示例。 - 指导用户:建议他们去洛谷题目页面查看。 - 如果可能,给出假设的样例或常见模式。 但最安全的是承认我没有具体样例,但解释如何获取。 为了真实可靠,我不能编造测试样例。 相关问题部分:生成与题目测试样例相关的问题。 例如: 1. 如何理解测试样例在编程题目中的作用? 2. 洛谷题目测试样例的标准格式是什么? 3. 如何为P1874设计测试用例? 现在,整合到一个回答中。 </think> ### 关于洛谷P1874题目测试样例的查询 我理解您希望在洛谷P1874题目中找到测试样例(即输入输出示例)。测试样例是题目描述的一部分,通常包括一组或多组输入数据和对应的预期输出,用于验证程序在给定条件下的正确性。不过,我需要澄清几点: - **我的信息来源限制**:作为AI,我无法实时访问外部网站或数据库(如洛谷的题目页面)。提供的引用内容中没有提到洛谷P1874题目的具体信息(引用[1]到[5]涉及其他题目,如P5713、P5146等)。因此,我不能直接提供P1874的真实测试样例。 - **如何获取测试样例**:您可以在洛谷官方网站上搜索题目P1874。具体步骤: 1. 访问洛谷官网([www.luogu.com.cn](https://www.luogu.com.cn))。 2. 在搜索栏中输入题目编号“P1874”,进入题目页面。 3. 在题目描述部分,通常会包含“输入样例”和“输出样例”小节,直接列出测试用例。 - **一般性测试样例结构**:基于洛谷题目的通用模式,测试样例通常包括: - 简单边界情况(如最小输入值)。 - 典型场景(如中等规模数据)。 - 复杂边缘情况(如最输入值或特殊排列)。 例如,如果P1874是一个排序或动态规划问题(常见于洛谷题目),样例可能类似: ``` 输入样例: 5 3 1 4 2 5 输出样例: 1 2 3 4 5 ``` 但这只是假设性示例,实际题目需以官网为准[^luogu]。 如果您能提供更多题目细节(如题目名称或描述),我可以帮助分析常见的测试样例模式或解释如何设计测试用例。 ### 相关问题 1. 如何理解测试样例在编程竞赛题目中的作用? 2. 洛谷题目测试样例的格式和常见陷阱有哪些? 3. 对于动态规划类题目(如P1874可能涉及),如何设计有效的测试用例?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值