好久之前就想学了 然后今天恰巧一道题需要用到就学了

前置芝士

1.主席树[可持久化数组]

2.并查集

如果你掌握了前面两个那么这个东西你就会觉得非常沙茶。。

构造

可持久化并查集 = 主席树  + 并查集

有点蠢= =

当然 我们这里的并查集是要按秩合并的并查集

[按秩合并:就是把dep小的连接到大的上面 这个复杂度分析出来是O(lgn)的 原因不要问我 我不知道= =]

不可以路径压缩 原因好像是可以被极限数据卡掉?[我也不知道路径压缩了你怎么访问历史版本的emm。。]

这样的话 我们每次开log个节点连下来 然后对于每个点维护fa和dep就可以了

然后dep的更新就是 当两个高度一样的时候 连起来那么被连的深度需要+1

就没了qwq。

例题就是BZOJ3673 真·模板

代码。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define mxn 200010
#define pa pair<int,int>
#define mp make_pair
using namespace std; struct node{int ls,rs,fa,dep;}t[mxn*40];
int cnt,rt[mxn],n;
void build(int &x,int l,int r)
{
x=++cnt;
if(l==r){t[x].fa=l;t[x].dep=1;return;}
int mid=l+r>>1;
build(t[x].ls,l,mid); build(t[x].rs,mid+1,r);
} void insert(int &x,int lt,int l,int r,int d,int fa)
{
x=++cnt; t[x] = t[lt];
if(l==r){t[x].fa = fa; return;}
int mid = l+r>>1;
if(d<=mid) insert(t[x].ls,t[lt].ls,l,mid,d,fa);
else insert(t[x].rs,t[lt].rs,mid+1,r,d,fa);
} void update(int x,int l,int r,int d)
{
if(l==r){t[x].dep++; return;}
int mid = l+r>>1;
if(d<=mid) update(t[x].ls,l,mid,d);
else update(t[x].rs,mid+1,r,d);
} int query(int x,int l,int r,int d)
{
if(l==r) return x;
int mid = l+r>>1;
if(d<=mid) return query(t[x].ls,l,mid,d);
else return query(t[x].rs,mid+1,r,d);
} int find(int root,int x)
{
int pos = query(root,1,n,x);
if(t[pos].fa==x) return pos;
return find(root,t[pos].fa);
} int main()
{
int m,opt,x,y;
scanf("%d%d",&n,&m);
build(rt[0],1,n);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&opt,&x);
if(opt==2){rt[i]=rt[x];continue;}
scanf("%d",&y); rt[i]=rt[i-1];
int fx = find(rt[i],x),fy = find(rt[i],y);
if(opt==1)
{
if(fx!=fy)
{
if(t[fx].dep < t[fy].dep) swap(fx,fy);
int ffx = t[fx].fa , ffy = t[fy].fa;
insert(rt[i],rt[i-1],1,n,ffy,ffx);
if(t[fx].dep == t[fy].dep) update(rt[i],1,n,ffx);
}
}
else printf("%d\n",t[fx].fa==t[fy].fa);
}
return 0;
}

最新文章

  1. hdu3549还是网络流
  2. JavaScript学习笔记-实例详解-类(一)
  3. Mark一下,Android ListView的上下间隙
  4. 【JavaScript基础学习】关于正则表达式的完整内容
  5. ExpandableList列表的简单应用
  6. uva 498 - Polly the Polynomial
  7. VS C++工程类成员初始化检测脚本
  8. Android 不能返回 parent Activity 的问题
  9. 【js】基本类型和引用类型的区别
  10. MySQL binlog 的恢复操作
  11. 以springMVC为例获取上传视频文件时长
  12. 场景:如果一个select下拉框的值被选中,其他两个字段值的校验也生效
  13. Centos 7安装和配置 ElasticSearch入门小白
  14. C盘清理
  15. 《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转
  16. IDEA中在目录中如何快速指定到当前的类
  17. CSS------li中的宽和高无法修改问题
  18. mysql 常用命令 常用SQL语句
  19. 联通营业厅API 获取个人信息
  20. 6/11 sprint2 看板和燃尽图的更新

热门文章

  1. BZOJ 2286: [Sdoi2011]消耗战 虚树
  2. 批量搞机(二):分布式ELK平台、Elasticsearch介绍、Elasticsearch集群安装、ES 插件的安装与使用
  3. Nginx 禁止IP访问 只允许域名访问
  4. ionic学习使用笔记(二) slide 组件的使用
  5. Js获取屏幕宽度、高度
  6. iOS打印各种类型数据
  7. spring cloud网关gateway
  8. 修改linux文件的mtime
  9. XML scriptlet 连接数据库
  10. rsync+sersync实现文件同步