CF414E Mashmokh's Designed Problem(ETT+二分)

ETT维护欧拉序。每个点维护它的深度,出点入点基本无异。
第一个操作求个lca就好了qaq,x,y的lca就是(in[x],out[y])中深度最小的点的父亲。
第二个操作,x的kth祖先,就是[1,in[x]]中最靠右的深度为dep[x]-k的点。
第三个操作,我们注意到欧拉序上一段连续的区间的深度是连续的,于是我们可以维护每个区间的深度最小/最大值,然后二分来找到深度k的最后一个出现位置,直接在splay上二分即可。
其他的就是普通ETT的操作了。
复杂度 O(qlogn) O ( q l o g n )
不用加哨兵…坑我半天不会把哨兵放进去。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(T==S){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,m,in[N],out[N],dfn=0,fa[N<<1],c[N<<1][2],dep[N<<1],mn[N<<1],mx[N<<1],id[N<<1],rt=0,tag[N<<1],sz[N<<1],q[N<<1];
vector<int>Son[N];
inline void dfs(int x,int dept){
    in[x]=++dfn;dep[dfn]=dept;id[dfn]=x;
    for(int i=0;i<Son[x].size();++i) dfs(Son[x][i],dept+1);
    out[x]=++dfn;dep[dfn]=dept;id[dfn]=x;
}
inline void update(int p){
    int l=c[p][0],r=c[p][1];
    sz[p]=sz[l]+sz[r]+1;
    mx[p]=mn[p]=dep[p];
    mx[p]=max(mx[p],max(mx[l],mx[r]));
    mn[p]=min(mn[p],min(mn[l],mn[r]));
}
inline void doadd(int p,int val){
    tag[p]+=val;dep[p]+=val;mn[p]+=val;mx[p]+=val;
}
inline void pushdown(int p){
    if(!tag[p]) return;int l=c[p][0],r=c[p][1];
    if(l) doadd(l,tag[p]);if(r) doadd(r,tag[p]);tag[p]=0;
}
inline void build(int &p,int l,int r){
    int mid=l+r>>1;p=mid;
    if(l<mid) build(c[p][0],l,mid-1),fa[c[p][0]]=p;
    if(r>mid) build(c[p][1],mid+1,r),fa[c[p][1]]=p;update(p);
}
inline void rotate(int x,int &k){
    int y=fa[x],z=fa[y],l=x==c[y][1],r=l^1;
    if(y==k) k=x;
    else c[z][y==c[z][1]]=x;
    fa[c[x][r]]=y;fa[y]=x;fa[x]=z;
    c[y][l]=c[x][r];c[x][r]=y;update(y);update(x);
}
inline void splay(int x,int &k){
    int top=0;q[++top]=x;
    for(int xx=x;xx!=k;xx=fa[xx]) q[++top]=fa[xx];
    while(top) pushdown(q[top--]);
    while(x!=k){
        int y=fa[x],z=fa[y];
        if(y!=k){
            if(x==c[y][1]^y==c[z][1]) rotate(x,k);
            else rotate(y,k);
        }rotate(x,k);
    }
}
inline int findk(int p,int x){
    int r=c[p][1];pushdown(p);
    if(mn[r]<=x&&mx[r]>=x) return findk(r,x);
    if(dep[p]==x) return id[p];
    return findk(c[p][0],x);
}
inline int split(int x,int y){
    splay(x,rt);splay(y,c[x][1]);return c[y][0];
}
inline int getpre(int x){
    splay(x,rt);int res=c[x][0];
    while(c[res][1]) res=c[res][1];
    return res;
}
inline int getsucc(int x){
    splay(x,rt);int res=c[x][1];
    while(c[res][0]) res=c[res][0];
    return res;
}
inline int del1(int x,int y){
    int xx=getpre(x),yy=getsucc(y);
    x=split(xx,yy);y=fa[x];c[y][0]=fa[x]=0;update(y);update(fa[y]);return x;
}
int main(){
//  freopen("a.in","r",stdin);
    n=read();m=read();mx[0]=0;mn[0]=inf;
    for(int i=1;i<=n;++i){
        int owo=read();
        while(owo--) Son[i].push_back(read());
    }dfs(1,0);build(rt,1,n<<1);
    while(m--){
        int op=read(),x=read();
        if(op==3){
            printf("%d\n",findk(rt,x));continue;
        }int y=read();
        if(op==1){
            splay(in[x],rt);int xx=sz[c[in[x]][0]]+1,res=dep[in[x]];
            splay(in[y],rt);int yy=sz[c[in[y]][0]]+1;res+=dep[in[y]];
            if(xx>yy) swap(x,y);x=split(in[x],out[y]);res-=2*(mn[x]-1);
            printf("%d\n",res);continue;
        }splay(in[x],rt);int val=y-1;y=findk(c[rt][0],dep[in[x]]-y);
        x=del1(in[x],out[x]);doadd(x,-val);int xx=getpre(out[y]);
        splay(xx,rt);splay(out[y],c[rt][1]);c[out[y]][0]=x;fa[x]=out[y];
        update(out[y]);update(rt);
    }return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ETT油温数据分析是一种基于数学建模的方法。ETT是“Engine Test Temperature”的缩写,它是一种用于发动机测试的温度数据。在发动机测试过程中,通过传感器采集发动机的油温数据,并将这些数据进行分析和建模,以评估发动机的性能和健康状况。 ETT油温数据分析的数学建模主要包括以下几个方面: 1. 数据预处理:对采集到的原始油温数据进行去噪、平滑和筛选等处理,以减少噪声和异常值的影响,提高数据的质量和可靠性。 2. 特征提取:从预处理后的油温数据中提取有意义的特征,如最大值、最小值、平均值等,用于描述发动机的工作状态和特性。 3. 建立数学模型:根据特征和目标需求,选择合适的数学模型,如统计模型、机器学习模型等,来描述发动机的油温变化规律和与其他因素(如负载、转速)的关系。 4. 参数估计和优化:利用已有的数据和建立的数学模型,采用参数估计和优化方法,拟合模型参数,从而更准确地描述和预测发动机油温的变化。 5. 模型评估与验证:对建立的数学模型进行评估和验证,通过与实际观测数据进行比对和分析,评估模型的准确性和可靠性,进一步优化和改进模型。 通过ETT油温数据分析的数学建模,可以帮助发动机制造商和维修人员更好地了解发动机工作状态,及时发现和解决潜在故障和问题,提高发动机的性能和可靠性。此外,还可以为发动机设计和优化提供科学依据,降低发动机的能耗和排放,并提高发动机的使用寿命。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值