BZOJ4551 - [TJOI2016]树

本文介绍了一种利用LCT树和Splay树解决有根树上的标记与查询问题的方法。在一个包含10^5个节点的有根树上,通过对节点进行标记和查询其祖先中最深的被标记节点,实现高效操作。通过使用LCT树进行路径压缩,结合Splay树的旋转操作,达到了O(Qlogn)的时间复杂度。

Portal

Description

给出一棵\(n(n\leq10^5)\)个点的以\(1\)为根的有根树,进行\(Q(Q\leq10^5)\)次操作:

  • 标记一个点\(x\)
  • 询问\(x\)的祖先中(包括\(x\)),距\(x\)最近的被标记的点。

Solution

用lct搞一搞就行啦。标记点\(x\)splay(x),询问时access(x)后求最深的被标记点即可。

时间复杂度\(O(Qlogn)\)

Code

//树
#include <cstdio>
inline char gc()
{
    static char now[1<<16],*s,*t;
    if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
    return *s++;
}
inline int read()
{
    int x=0; char ch=gc();
    while(ch<'0'||'9'<ch) ch=gc();
    while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x;
}
int const N=1e5+10;
int n,Q;
int cnt,h[N];
struct edge{int v,nxt;} ed[N<<1];
inline void edAdd(int u,int v)
{
    cnt++; ed[cnt].v=v,ed[cnt].nxt=h[u],h[u]=cnt;
    cnt++; ed[cnt].v=u,ed[cnt].nxt=h[v],h[v]=cnt;
}
int fa[N],ch[N][2]; int sum[N],val[N];
void bldTree(int u)
{
    for(int i=h[u];i;i=ed[i].nxt)
        if(ed[i].v!=fa[u]) fa[ed[i].v]=u,bldTree(ed[i].v);
}
inline int wh(int p) {return p==ch[fa[p]][1];}
inline int notRt(int p) {return p==ch[fa[p]][wh(p)];}
inline void update(int p) {sum[p]=sum[ch[p][0]]+val[p]+sum[ch[p][1]];}
inline void rotate(int p)
{
    int q=fa[p],r=fa[q],w=wh(p);
    fa[p]=r; if(notRt(q)) ch[r][wh(q)]=p;
    fa[ch[q][w]=ch[p][w^1]]=q;
    fa[ch[p][w^1]=q]=p;
    update(q),update(p);
}
void splay(int p)
{
    for(int q=fa[p];notRt(p);rotate(p),q=fa[p]) if(notRt(q)) rotate(wh(p)^wh(q)?p:q);
}
int rnk(int rt,int x)
{
    int p=rt;
    while(true)
        if(x<=sum[ch[p][0]]) p=ch[p][0];
        else if(x<=sum[ch[p][0]]+val[p]) return p;
        else x-=sum[ch[p][0]]+val[p],p=ch[p][1];
}
void access(int p) {for(int q=0;p;q=p,p=fa[p]) splay(p),ch[p][1]=q,update(p);}
int query(int p) {access(p),splay(p); return rnk(p,sum[p]);}
int main()
{
    n=read(),Q=read();
    for(int i=1;i<=n-1;i++) edAdd(read(),read());
    fa[1]=0,bldTree(1); val[1]=1,update(1);
    for(int i=1;i<=Q;i++)
    {
        char opt=gc(); while(opt!='C'&&opt!='Q') opt=gc();
        int u=read();
        if(opt=='C') val[u]=1,update(u),splay(u);
        else printf("%d\n",query(u));
    }
    return 0;
}

P.S.

这题原数据水到暴力AC...没错就是每次跳fa

转载于:https://www.cnblogs.com/VisJiao/p/BZOJ4551.html

**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值