ETT学习笔记

本文深入探讨了ETT(Euler Tour Tree)数据结构,一种高效处理有根树的算法,支持点权修改、子树修改、单点查询、点到根路径查询及节点父级更改等操作。通过维护欧拉序和区间平衡树,ETT实现了对树结构的灵活操作,模板代码详实,适合算法竞赛和高级数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ETT(Eular Tour Tree)是一种维护有根树的数据结构,支持以下操作

  1. 修改一个点的点权
  2. 子树修改
  3. 单点查询
  4. 点到根路径查询
  5. 修改一个点的父亲

据说可以支持换根,但用的不多而且据说很难写,所以似乎失传了(

其实没啥技术含量,顾名思义就是维护一棵树的欧拉序。

欧拉序指在 dfs 开始和结束时分别将当前点加入序列中,也称括号序。

用区间平衡树维护这个欧拉序。

平衡树不写 treap ,根本不是人

每个点第一次插入的权值为题目给定的权值,第二次插入时取相反数,要在平衡树上记录下这个符号,并记录下 每个原树上的点 两次插入时 在平衡树上的点 的编号。

对treap额外维护平衡树上的父结点 fa,然后可以找到给定编号的结点在平衡树上的排名。

单点操作直接搞就可以了。

因为欧拉序上一个子树对应的是一个括号,子树修改时直接修改这个括号的区间。注意每个点要分别乘上自己的符号,可以通过记录平衡树的子树的符号之和实现。

对于链查询,不难看出是这个点第一次出现的位置的前缀和,直接查询即可。

修改父亲直接把整个括号提出来插进新父亲第一次位置的后面。

复杂度是 O ( n log ⁡ n ) O(n\log n) O(nlogn),跑得比较慢

模板题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#include <cstdlib>
#include <cassert>
#define MAXN 200005
#define MAXM 400005
using namespace std;
inline char gal()
{
	char c=getchar();
	while (!isalpha(c)) c=getchar();
	return c;
}
inline int read()
{
	int ans=0;
	char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
typedef long long ll;
vector<int> e[MAXN];
int w[MAXN];
int sig[MAXN],ind[MAXN],siz[MAXN],rad[MAXN],ch[MAXN][2],fa[MAXN],tot;
ll val[MAXN],sum[MAXN],lzy[MAXN];
inline int newnode(int v,int type)
{
	++tot,siz[tot]=1,sum[tot]=val[tot]=v*type,sig[tot]=ind[tot]=type,rad[tot]=rand();
	return tot;
}
inline void update(int x)
{
	siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1,ind[x]=ind[ch[x][0]]+ind[ch[x][1]]+sig[x];
	sum[x]=sum[ch[x][0]]+sum[ch[x][1]]+val[x];
}
inline void pushlzy(int x,ll v){val[x]+=sig[x]*v,sum[x]+=v*ind[x],lzy[x]+=v;}
inline void pushdown(int x)
{
	if (lzy[x])
	{
		if (ch[x][0]) pushlzy(ch[x][0],lzy[x]);
		if (ch[x][1]) pushlzy(ch[x][1],lzy[x]);
		lzy[x]=0;
	}
}
int merge(int x,int y)
{
	if (!x||!y) return x|y;
	pushdown(x),pushdown(y);
	if (rad[x]<rad[y]) return ch[x][1]=merge(ch[x][1],y),ch[x][1]&&(fa[ch[x][1]]=x),update(x),x;
	return ch[y][0]=merge(x,ch[y][0]),ch[y][0]&&(fa[ch[y][0]]=y),update(y),y;
}
void split(int x,int k,int& l,int& r)
{
	if (!x) return (void)(l=r=0);
	pushdown(x);
	if (k<=siz[ch[x][0]]) split(ch[x][0],k,l,r),fa[ch[x][0]]=0,ch[x][0]=r,r&&(fa[r]=x),update(x),r=x;
	else split(ch[x][1],k-siz[ch[x][0]]-1,l,r),fa[ch[x][1]]=0,ch[x][1]=l,l&&(fa[l]=x),update(x),l=x;
}
int rt,l[MAXN],r[MAXN];
inline void modify(int l,int r,int v)
{
	int a,b,c,d;
	split(rt,l-1,a,d);
	split(d,r-l+1,b,c);
	pushlzy(b,v);
	rt=merge(merge(a,b),c);	
}
inline int getrk(int x)
{
	int f=1,ans=0;
	while (x)
	{
		if (f) ans+=siz[ch[x][0]]+1;
		f=(ch[fa[x]][1]==x),x=fa[x];
	}
	return ans;
}
void dfs(int u)
{
	int t;
	t=merge(rt,l[u]=newnode(w[u],1)),rt=t;
	for (int i=0;i<(int)e[u].size();i++) dfs(e[u][i]);
	t=merge(rt,r[u]=newnode(w[u],-1)),rt=t;
}
int main()
{
	int n=read();
	for (int i=2;i<=n;i++) e[read()].push_back(i);
	for (int i=1;i<=n;i++) w[i]=read();
	dfs(1);
	for (int T=read();T;T--)
	{
		char op=gal();
		if (op=='Q') 
		{
			int a,b;
			split(rt,getrk(l[read()]),a,b);
			printf("%lld\n",sum[a]);
			rt=merge(a,b);
		}
		if (op=='C')
		{
			int x,y;
			x=read(),y=read();
			int a,b,c,d,e;
			split(rt,getrk(l[x])-1,a,d);
			split(d,getrk(r[x]),b,c);
			e=merge(a,c);
			split(e,getrk(l[y]),a,c);
			rt=merge(merge(a,b),c);
		}
		if (op=='F')
		{
			int x,v;
			x=read(),v=read();
			modify(getrk(l[x]),getrk(r[x]),v);
		}
	}
	return 0;
}
<think>嗯,用户让我介绍一下ETT测试,我需要先弄清楚ETT到底指什么。ETT这个缩写可能有多种含义,不同领域可能有不同的解释。首先,我得考虑常见的可能性。 首先想到的是医学领域,ETT通常是Exercise Tolerance Test的缩写,也就是运动耐受测试,用来评估心脏功能。这是比较常见的术语,特别是在心内科,比如跑步机测试。但用户可能来自其他背景,所以需要确认是否有其他解释。 另外,ETT在工程或技术领域可能有不同含义,比如电子、通信等。例如,Electronic Test Technician(电子测试技术员)或者某些特定的测试协议。但医学中的ETT更为常见,所以可能需要优先考虑这个方向,但也要保持开放。 接下来,我应该先解释最常见的含义,即医学中的运动耐受测试,然后提到其他可能的领域,避免遗漏。用户可能没有明确指出领域,需要全面但简洁的回答。 要确保回答结构清晰,分点说明,符合用户要求的逐步解决问题。同时注意使用正确的中文术语,避免直译英文可能造成的误解。 另外,用户提供的系统级指令中提到数学表达式必须用$...$,但ETT测试相关内容可能不涉及太多数学,不过如果有涉及公式的地方需要注意格式。例如,如果提到心率计算,可能需要用公式,但一般情况下可能不需要。所以这部分可能用不上,但还是要留意。 需要验证ETT的其他可能含义。例如,在教育领域,ETT可能有不同的意思,或者软件测试中的某个术语。比如,Exploratory Testing Tool(探索性测试工具)或者某种测试方法。不过这些可能不如医学中的常见。 另外,ETT在通信中可能指Enhanced Transmission Technology(增强传输技术),但更多可能是指测试中的某个协议或方法。但不确定,可能需要简要提及可能存在其他领域的使用,但重点放在医学。 总结来说,回答结构应该是: 1. 介绍ETT测试的常见医学含义,详细说明目的、过程、适用情况等。 2. 提到其他领域可能的ETT缩写,但说明需要更多上下文确认。 3. 提醒用户根据具体领域进一步确认,以确保准确性。 需要确保信息准确,尤其是医学部分,避免错误。比如,运动耐受测试的正确步骤、使用的设备(如跑步机或自行车)、监测指标(心电图、血压、症状)等。 可能还需要提到测试的风险和注意事项,比如在哪些情况下不应进行测试,或者测试中可能出现的反应。 此外,要使用口语化的中文,但保持专业性。比如使用“例如”、“通常”、“可能”等词语,避免绝对化表述,因为某些信息可能有例外情况。 检查是否有常见的错误,比如将ETT与其他缩写混淆,比如ETC(电子收费系统)等,但ETT在医学中的标准缩写确实是Exercise Tolerance Test,所以没问题。 最后,确保回答符合用户要求的格式:结构清晰,分步骤,使用中文,正确使用LaTeX(如果有数学内容的话)。不过这里可能不需要数学公式,所以可能不涉及,但如果有提及心率计算公式,例如最大心率=220-年龄,可以写成$220 - \text{年龄}$,但可能不需要,因为用户问题不涉及具体计算。 综上所述,整理回答内容,分点解释医学中的ETT,然后简要提及其他可能性,最后建议用户提供更多信息以便更准确的解答。</think>ETT测试的常见解释及介绍如下(需结合具体领域确认): 1. **医学领域:运动耐受测试(Exercise Tolerance Test, ETT)** - **目的**:评估心脏在运动负荷下的供血能力,辅助诊断冠心病、心律失常等。 - **过程**: - 患者在跑步机或固定自行车上逐步增加运动强度。 - 实时监测心电图(ECG)、血压、血氧及症状(如胸痛、头晕)。 - 持续至目标心率($220 - \text{年龄} \times 0.85$)或出现异常体征。 - **适用场景**: - 排查胸痛是否为心源性 - 评估心脏病患者康复效果 - 检测运动诱发的心律失常 - **风险与禁忌**: - 急性心梗、不稳定心绞痛患者不宜进行 - 可能出现血压骤降、晕厥等(发生率<1%) 2. **其他领域可能的ETT含义** - **电子测试技术(Electronic Test Technology)**:涉及电路板、芯片的功能检测。 - **教育测试(Educational Testing Tool)**:部分机构用于评估学习能力。 - **环境测试(Environmental Tolerance Test)**:产品耐高温、湿度等性能验证。 3. **用户需进一步明确** 若以上不匹配您的需求,请补充: - 测试应用场景(如医疗/工业/教育) - 具体行业或检测对象 - 测试目的(如诊断疾病/质量控制) 注:医学ETT的敏感度约67%、特异度72%,常需结合冠脉造影进一步确诊。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值