bzoj3674 可持久化并查集
可持久化并查集的模板题……
做法好像很多,可以标号法,可以森林法。
本来有O(mloglogn)的神算法(按秩合并+倍增),然而我这种鶸渣就只会写O(mlog2n)的民科算法……再加上人傻常数大如狗,速度简直虚死……
言归正传,鉴于标号法用的不多,这里用的是森林法。又由于并查集的路径压缩只能均摊logn,如果可持久化一下就废了。所以路径压缩大可不写,正好偷偷懒。
当然,路径压缩都省了,那按秩合并就不能不写了(要不然为啥要出加强版……)。然而我太鶸,不会写按秩合并,一向都是用按大小合并代替的……不过效果还不错,复杂度好像也是个log。
可持久化数组好像有用vector记录修改的神写法,然而我这种鶸渣只会写可持久化线段树……本来就是nlogn了,再乘上一个logn,运行时间实在感人……
总之,写的是可持久化线段树+按秩合并+暴力找父亲(不过貌似大家都是写的按秩合并暴力?然而明明同样O(mlog2n)的算法我就是最慢的那个……)。代码丑,不愿看……就算了……
- /**************************************************************
- Problem: 3674
- User: hzoier
- Language: C++
- Result: Accepted
- Time:1636 ms
- Memory:201612 kb
- ****************************************************************/
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int maxn=;
- int findroot(int);
- void mergeset(int,int);
- void build(int,int,int&);
- void modify(int,int,int&);
- void query(int,int,int);
- int copy(int);
- int lc[maxn<<],rc[maxn<<],a[maxn<<],b[maxn<<],root[maxn],cnt=;
- int n,m,d,x,y,k,prt,size,now,ans=;
- int main(){
- scanf("%d%d",&n,&m);
- build(,n,root[]);
- for(now=;now<=m;now++){
- scanf("%d",&d);
- if(d==){
- scanf("%d%d",&x,&y);
- x^=ans;y^=ans;
- root[now]=copy(root[now-]);
- mergeset(x,y);
- }
- else if(d==){
- scanf("%d%d",&x,&y);
- x^=ans;y^=ans;
- root[now]=copy(root[now-]);
- printf("%d\n",ans=(int)(findroot(x)==findroot(y)));
- }
- else{
- scanf("%d",&x);
- x^=ans;
- root[now]=copy(root[x]);
- }
- }
- return ;
- }
- int findroot(int x){
- for(;;){
- k=x;
- query(,n,root[now]);
- if(prt==x)return x;
- x=prt;
- }
- return x;
- }
- void mergeset(int x,int y){
- x=findroot(x);y=findroot(y);
- if(x==y)return;
- k=x;
- query(,n,root[now]);
- int sx=size;
- k=y;
- query(,n,root[now]);
- if(sx>size)swap(x,y);
- sx+=size;
- size=;
- k=x;
- prt=y;
- modify(,n,root[now]);
- k=y;
- size=sx;
- modify(,n,root[now]);
- }
- void build(int l,int r,int &rt){
- rt=++cnt;
- if(l==r){
- a[rt]=l;
- b[rt]=;
- return;
- }
- int mid=(l+r)>>;
- build(l,mid,lc[rt]);
- build(mid+,r,rc[rt]);
- }
- void modify(int l,int r,int &rt){
- rt=copy(rt);
- if(l==r){
- if(prt)a[rt]=prt;
- if(size)b[rt]=size;
- return;
- }
- int mid=(l+r)>>;
- if(k<=mid)modify(l,mid,lc[rt]);
- else modify(mid+,r,rc[rt]);
- }
- void query(int l,int r,int rt){
- if(l==r){
- prt=a[rt];
- size=b[rt];
- return;
- }
- int mid=(l+r)>>;
- if(k<=mid)query(l,mid,lc[rt]);
- else query(mid+,r,rc[rt]);
- }
- int copy(int rt){
- int x=++cnt;
- lc[x]=lc[rt];
- rc[x]=rc[rt];
- a[x]=a[rt];
- b[x]=b[rt];
- return x;
- }
尽头和开端,总有一个在等你。
bzoj3674 可持久化并查集的更多相关文章
- bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版
bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...
- BZOJ3674: 可持久化并查集加强版
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3674 题解:主要是可持久化的思想.膜拜了一下hzwer的代码后懂了. 其实本质是可持久化fa数 ...
- 2019.01.21 bzoj3674: 可持久化并查集加强版(主席树+并查集)
传送门 题意:维护可持久化并查集,支持在某个版本连边,回到某个版本,在某个版本 询问连通性. 思路: 我们用主席树维护并查集fafafa数组,由于要查询历史版本,因此不能够用路径压缩. 可以考虑另外一 ...
- bzoj3673 bzoj3674可持久化并查集
并查集都写不来了qwq 之前写的是错的 sz的初值都是0,这样怎么加就都是0了,水这道题还是可以,但是加强版就过不了了 #include<cstdio> #include<cstri ...
- [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky
思路: 用主席树维护并查集森林,每次连接时新增结点. 似乎并不需要启发式合并,我随随便便写了一个就跑到了3674第一页?3673是这题的弱化版,本来写个暴力就能过,现在借用加强版的代码(去掉异或),直 ...
- BZOJ3674 可持久化并查集加强版 可持久化 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3674 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...
- 【可持久化数组】【rope】bzoj3673 bzoj3674 可持久化并查集 by zky
rope教程:http://blog.csdn.net/iamzky/article/details/38348653 Code(bzoj3673): #include<cstdio> # ...
- BZOJ3674可持久化并查集(模板)
没什么可说的,就是一个可持久化线段树维护一个数组fa以及deep按秩合并好了 注意一下强制在线 蒟蒻的我搞了好长时间QAQ 贴代码: #include<cstdio> #include&l ...
- bzoj3673 & bzoj3674 & 洛谷P3402 可持久化并查集
题目:bzoj3673:https://www.lydsy.com/JudgeOnline/problem.php?id=3673 bzoj3674:https://www.lydsy.com/Jud ...
随机推荐
- 前端之html
前端之html 本节内容 前端概述 html结构 标签探秘 <!DOCTYPE html>标签 head标签 body标签 1.前端概述 一个web服务的组成分为前端和后端部分,前端部分负 ...
- 部署 OpenStack VirtualBox
VirtualBox 中部署 OpenStack 大家新年好,CloudMan 今天给大家带来一件新年礼物. 一直以来大家都反馈 OpenStack 学习有两大障碍:1. 实验环境难搭2. 体系复杂, ...
- Struts2 token禁止重复提交表单
如果服务器响应慢的情况下,用户会重复提交多个表单,这时候有两种设计思想: 1.在客户端使用JS技术,禁止客户重复提交表单.但是这样会使一些不使用浏览器方式登陆的人比如使用底层通信来攻击你的服务器 2. ...
- jquery.lazyload 实现图片延迟加载jquery插件
看到了淘宝产品介绍中,图片是在下拉滚动条时加载,这是一个很不错的用户体验.减少了页面加载的时间了,也减轻了服务器的压力,就查了下用JQuery.. 什么是ImageLazyLoad技术 在页面上图 ...
- iOS面试
1.进程.线程的区别?2.“三次握手”是什么?具体细节,连接释放时需要几次“握手”,说出大概过程.3.TCP.UDP协议的区别?计算机网络分几层,以及TCP.Http协议各自工作在哪一层及相关细节.4 ...
- RecyclerView的使用(四)
前面我们已经实现了RecyclerView的大部分功能了,但是有个很明显的缺陷-------没有点击效果!这就坑爹了 ListView自带点击效果好嘛!连这个都要自己定义.... 话不多说,下面就来为 ...
- Flyme适配源码更新命令,轻松完成打包
第一次已经同步了所有源码(花了很长时间),第一次已经连接手机进行了插桩和解reject,那么第二次还需要这么麻烦吗?答案是:NO ! 1.官方源码,执行如下命令可以实现: repo sync -c 2 ...
- BZOJ4540 [Hnoi2016]序列
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- iOS播放器 - AVPlayer
之前有说到在播放器中一点点小技巧,现在正式记录一下AVPlayer. 这里主要是说明用AVPlayer做音乐播放器的功能实现,所以不介绍AVPlayer中那个图层类. 首先我们要声明一下播放器,这里有 ...
- 逆向工程学习第三天--另外一个ShellCode
上周自己打造的添加用户的shellcode太长,不过当时主要目的是为了锻炼手动asm,熟悉一些复杂的参数类型如何手动进行构造,然后通过堆栈传递. 接下来就打造一个弹计算器的shellcode来进行接下 ...