bzoj 36733674 可持久化并查集加强版(可持久化线段树+启发式合并)

  CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%%

  学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好处理一些。

  然后就用可持久化线段树来维护这个可持久化数组,就能做到可持久化并查集,可持久化平衡树,可持久化之类的云云

  3673不需要按秩合并,3674需要。。。用3674就能过俩,双倍经验双倍的幸福!

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
#define ll long long 
using namespace std;
const int maxn=200010,inf=1e9;
struct poi{int lt,rt,fa,dep;}tree[maxn*40];
int n,m,ty,x,y,z,tot,sz;
int root[maxn];
void read(int &k)
{int f=1;k=0;char c=getchar();while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar();k*=f;
}
void build(int &x,int l,int r)
{x=++sz;if(l==r){tree[x].fa=l;return;}int mid=(l+r)>>1;build(tree[x].lt,l,mid);build(tree[x].rt,mid+1,r);
}
void update(int &x,int l,int r,int cx,int delta)
{tree[++sz]=tree[x];x=sz;if(l==r){tree[x].fa=delta;return;}int mid=(l+r)>>1;if(cx<=mid)update(tree[x].lt,l,mid,cx,delta);else update(tree[x].rt,mid+1,r,cx,delta);
}
void add(int &x,int l,int r,int cx)
{tree[++sz]=tree[x];x=sz;if(l==r){tree[x].dep++;return;}int mid=(l+r)>>1;if(cx<=mid)add(tree[x].lt,l,mid,cx);else add(tree[x].rt,mid+1,r,cx);    
}
int query(int x,int l,int r,int cx)
{if(l==r)return x;int mid=(l+r)>>1;if(cx<=mid)return query(tree[x].lt,l,mid,cx);else return query(tree[x].rt,mid+1,r,cx);    
}
int gf(int k,int x){int xx=query(k,1,n,x);return tree[xx].fa==x?xx:gf(k,tree[xx].fa);}
int main()
{read(n);read(m);build(root[0],1,n);for(int i=1;i<=m;i++){read(ty);root[i]=root[i-1];if(ty==1){read(x);read(y);x=gf(root[i],x);y=gf(root[i],y);if(tree[x].fa==tree[y].fa)continue;if(tree[x].dep>tree[y].dep)swap(x,y);update(root[i],1,n,tree[x].fa,tree[y].fa);if(tree[x].dep==tree[y].dep)add(root[i],1,n,tree[y].fa);}else if(ty==2)read(x),root[i]=root[x];else read(x),read(y),printf("%d\n",tree[gf(root[i],x)].fa==tree[gf(root[i],y)].fa);}return 0;
}
View Code

转载于:https://www.cnblogs.com/Sakits/p/7418281.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux apache守护进程,Linux基础命令---httpd守护进程

httpdhttpd是apache超文本传输协议的主程序&#xff0c;它被设计成一个独立运行的守护进程。httpd会建立一个线程池来处理http请求。此命令的适用范围&#xff1a;RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。1、语法httpd [选项]2、参数列表选项说明-d serverroo…

银行家舍入VS四舍五入(下):.NET发现之旅(四)

接上节这一节继续讨论银行家舍入和四舍五入三&#xff0c;自己动手开发四舍五入组件<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />事实上四舍五入在很多项目中还经常使用&#xff0c;所以我们可以动手开发一个这样的组件&…

linux dd安装系统,通过DD命令安装Windows,并介绍几款DD镜像包

Loading...原则上仅适用于独立服务器&#xff0c;并未添加其他虚拟化驱动online/oneprovider/hetzner的服务器已经过测试可以正常使用首先进入服务器的救援系统进入救援系统后使用root权限输入以下命令&#xff0c;然后等待一段时间后可尝试远程连接win10LTSC&#xff1a;wget …

FMS3系列(六):使用远程共享对象(SharedObject)实现多人时时在线聊天(Flex | Flash)

FMS开发中&#xff0c;经常会使用共享对象来同步用户和存储数据。对于实现广播文字信息实现聊天的支持非常强大&#xff0c;还可以跟踪用户的时时动作&#xff0c;在开发Flash多人在线游戏中的应用也非常广阔。 在使用FMS开发共享对象时需要注意&#xff0c;只有使用Flash Medi…

linux原理 培训,Linux容器技术原理和使用

1.1 隔离和共享在一个多员共用的开发环境或者一台服务器运行多个逻辑隔离的服务器进程。谁的运行环境也不希望影响到另一个谁。也就是一个物理机器需要虚拟化出多个环境或者容器。通过提供一种创建和进入容器的方式&#xff0c;操作系统让应用程序就像在独立的机器上运行一样&a…

工业无线遥控器 SUNRF-1011RC

工业无线遥控器 SUNRF-1011RC工业无线遥控器产品 授权操作 一&#xff1a;简介&#xff1a;工业无线遥控器&#xff0c;是针对工业环境&#xff0c;专门设计的无线控制替代有线控制的方案。和有线控制一样&#xff0c;具有实时性、灵活性、多路同时操作、操作灵活顺畅无…

C语言封装带省略参数的函数,C与C++的函数声明中省略参数的不同意义

一直都以为C/C中形如int func();这样的函数声明其意义就是一个参数 void(没有参数)的函数。然而今天在看C的时候突然看到这么一句&#xff1a;对于带空参数表的函数&#xff0c;C和C有很大的不同。在C语言中&#xff0c;声明int func2();表示“一个可带任意参数(任意数目&#…

理解快速生成树协议(RSTP)(二)

RSTP引进了新的BPDU处理以及一种新的拓扑结构改变机制。即使没有从根桥处接收到任何信号&#xff0c;每个网桥在每次“hello时间周期中”中都生成BPDU。BPDU扮演了在网桥间进行消息通知的角色。如果一个网桥不能从临近网桥处收到BPDU&#xff0c;它就会认为与这个网桥失去了连接…