Tree

hdu 4757
树链剖分 + 可持久化trie树
到现在才有点大彻大悟,可持久化trie的作用就是可以查询到历史版本, 那么既然可以,最最暴力的做法,就是每一个点都建立一个新的,这个新的版本既包含旧版本, 也包含最新的结点, 但是空间复杂度实在是不敢恭维, 故大佬们想的做法就是在暴力的基础上进行修改, 每个点依旧建立新版本, 但是只建立之前旧版本没有的东西, 然后再把旧版本和这个空间占用上面很小的结点联系起来, 这样既降低了空间复杂度, 还能新老版本一块使用, 每个结点都代表一个新版本 , 然后还和旧版本连接在一起,例如rt[x] ,表示第x个结点所在的新版本, 那么这个rt[x] , 里面只存储了这个新版本的信息和x - 1 的联系, 然后rt[x - 1] 存储的是x - 1 这个新版本的信息, 链接的是x - 2 ,这个旧版本,所以这样就实现了可持久化数据结构,
然后就在处理好树链剖分的树上结构进行可持久化trie树,
建立的话旧版本就是父亲结点, 新版本就是孩子结点了。

#include <bits/stdc++.h>
using namespace std ;
const int N = 1e5 + 10 ;
int e[N << 1] , ne[N << 1] , num[N << 5] , h[N << 1] , size[N <<2] , son[N << 2] , ch[N << 5][2] ;
int n , m , idx , cnt  ; 
int fa[N << 1] , deep[N << 1] , top[N << 1] , rt[N << 1] , val[N<< 1];



 void dfs1(int u , int f , int d)
{
    size[u] = 1 , son[u] = 0 , fa[u] = f , deep[u] = d;
    for(int i = h[u] ; ~i ;i = ne[i]) 
     {
         int v = e[i] ;
         if(v == f) continue ;
         dfs1(v , u , d + 1 ) ;
         size[u] += size[v] ;
         if(!son[u] || size[son[u]] < size[v])
          son[u] = v ;
     }
}
void dfs2(int u , int tp)
{
    top[u] = tp ;
    if(!son[u]) return ;
    dfs2(son[u] , tp) ;
    for(int i = h[u] ; ~i ; i = ne[i])
     {
         int v = e[i] ;
        if(v == fa[u] || v == son[u]) continue ;
        dfs2(v , v) ;
     }
}
int lca(int x , int y)
{
    while(top[x] != top[y])
     {
         if(deep[top[x]] < deep[top[y]]) 
          swap(x , y) ;
         x = fa[top[x]] ;
     }
     return deep[x] > deep[y] ? y : x ;
} 
void add(int a, int b)
{
    e[idx] = b , ne[idx] = h[a] , h[a] = idx ++ ;
}
void insert(int last , int &now , int x)
{
    now = ++ cnt ;
    int p = now ;
    for(int i = 30 ;i >= 0;i --)
     {
         int id = (x >> i) & 1 ;
         ch[p][id] = ++ cnt ;
         ch[p][id ^ 1] = ch[last][id ^ 1] ;
         num[p] = num[last] + 1;
         p = ch[p][id] , last = ch[last][id] ;
     }
     num[p] = num[last] + 1 ;
}
void dfs(int u)
{
    insert(rt[fa[u]] , rt[u] , val[u]) ;
    for(int i = h[u] ; ~i ;i = ne[i])
     {
         int v = e[i] ;
         if(v == fa[u]) 
          continue ;
         dfs(v) ;
     }
}
int ask(int x , int y , int z , int v) 
{
    int res = v ^ val[z] , ans = 0 ;
    z = rt[z] ;
    for(int i  = 30 ;i >= 0 ;i --)
     {
         int id = (v >> i) & 1 ;
         int t = num[ch[x][id ^ 1]] + num[ch[y][id ^ 1]] - 2 * num[ch[z][id ^ 1]] ;
         if(t > 0) 
          ans += 1 << i , id ^= 1 ;
         x =ch[x][id] , y = ch[y][id] , z = ch[z][id] ;
     }
     return max(ans , res) ;
}
int main()
{
   while(~scanf("%d%d" , &n , &m))
    {
        idx = 0 , cnt = 0 ;
        memset(h , -1 , sizeof h) ;
        for(int i = 1 ;i <= n ;i ++)
         scanf("%d" , &val[i]) ;
        for(int i = 1; i < n ;i ++)
         {
             int u , v ;
             scanf("%d%d" , &u , &v) ;
             add(u , v) , add(v , u) ;
         }
        dfs1(1 , 0 , 1) , dfs2(1 , 1) , dfs(1) ;
        for(int i = 1; i <= m ;i ++)
         {
             int x , y , z ;
             scanf("%d%d%d" , &x , &y , &z) ;
             printf("%d\n" , ask(rt[x] , rt[y] , lca(x , y) , z))  ;
         }
    } 
   return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面中可以对界面中显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面中查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值