[BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky

思路:

用主席树维护并查集森林,每次连接时新增结点。
似乎并不需要启发式合并,我随随便便写了一个就跑到了3674第一页?
3673是这题的弱化版,本来写个暴力就能过,现在借用加强版的代码(去掉异或),直接吊打暴力程序。

 1 #include<cstdio>
 2 #include<cctype>
 3 inline int getint() {
 4     register char ch;
 5     while(!isdigit(ch=getchar()));
 6     register int x=ch^‘0‘;
 7     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^‘0‘);
 8     return x;
 9 }
10 const int N=200001,SIZE=3850000;
11 class PresistentDisjointSet {
12     private:
13         unsigned int left[SIZE],right[SIZE],sz;
14         int anc[SIZE];
15         unsigned int newnode() {
16             return sz++;
17         }
18         unsigned int getpos(const unsigned int p,const int b,const int e,const int x) {
19             if(b==e) return p;
20             int mid=(b+e)>>1;
21             return (x<=mid)?getpos(left[p],b,mid,x):getpos(right[p],mid+1,e,x);
22         }
23     public:
24         unsigned int root[N];
25         PresistentDisjointSet() {
26             sz=0;
27         }
28         void Build(unsigned int &p,const int b,const int e) {
29             p=newnode();
30             if(b==e) {
31                 anc[p]=b;
32                 return;
33             }
34             int mid=(b+e)>>1;
35             Build(left[p],b,mid);
36             Build(right[p],mid+1,e);
37         }
38         unsigned int find(const unsigned int p,const int b,const int e,const int x) {
39             int q=getpos(p,b,e,x);
40             return x==anc[q]?q:find(p,b,e,anc[q]);
41         }
42         unsigned int Union2(const unsigned int p,const int b,const int e,const int x,const int y) {
43             unsigned int new_p=newnode();
44             if(b==e) {
45                 anc[new_p]=y;
46                 return new_p;
47             }
48             int mid=(b+e)>>1;
49             if(x<=mid) left[new_p]=Union2(left[p],b,mid,x,y),right[new_p]=right[p];
50             if(x>mid) right[new_p]=Union2(right[p],mid+1,e,x,y),left[new_p]=left[p];
51             return new_p;
52         }
53         bool isConnected(const int x,const int y) {
54             return anc[x]==anc[y];
55         }
56         unsigned int Union(const unsigned int p,const int b,const int e,int x,int y) {
57             x=find(p,b,e,x),y=find(p,b,e,y);
58             if(isConnected(x,y)) return p;
59             return Union2(p,b,e,anc[x],anc[y]);
60         }
61 };
62 PresistentDisjointSet s;
63 int main() {
64     int n=getint(),lastans=0;
65     s.Build(s.root[0],1,n);
66     int m=getint();
67     for(register int i=1;i<=m;i++) {
68         int op=getint();
69         if(op==1) s.root[i]=s.Union(s.root[i-1],1,n,getint()^lastans,getint()^lastans);
70         else if(op==2) s.root[i]=s.root[getint()^lastans];
71         else s.root[i]=s.root[i-1],printf("%d\n",lastans=s.isConnected(s.find(s.root[i],1,n,getint()^lastans),s.find(s.root[i],1,n,getint()^lastans)));
72     }
73     return 0;
74 }
时间: 2024-10-29 19:09:43

[BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky的相关文章

【BZOJ】3673: 可持久化并查集 by zky &amp; 3674: 可持久化并查集加强版(可持久化线段树)

http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id=3673 双倍经验啦啦啦.. 给主席树换了个名称果然高大上... 首先要可持久化并查集其实就是可持久化数组... 那么因为数组的形式是这样的$P[x]$,那么我们用一种数据结构实现查找x返回对应的$P[x]$即可啦啦啦. 然后那么我所学的可持久化目前只有主席树QAQ哪天去写写fhqtreap...

bzoj3673可持久化并查集 by zky&amp;&amp;bzoj3674可持久化并查集加强版

bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以使合并均摊复杂度为O(nlog2n).可持久化线段树实际上就是在更新节点时按主席树的插入方式新建一条路径(其实主席树就是可持久化权值线段树). 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm&g

可持久化并查集加强版 BZOJ 3674

http://www.lydsy.com/JudgeOnline/problem.php?id=3674 3674: 可持久化并查集加强版 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 3225  Solved: 1192[Submit][Status][Discuss] Description Description:自从zkysb出了可持久化并查集后--hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可

BZOJ 3674: 可持久化并查集加强版

3674: 可持久化并查集加强版 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 2605  Solved: 977[Submit][Status][Discuss] Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状

工作安排加强版(神奇的并查集)

题目描述: 为了维持农场的运转,约翰必须打工赚钱.他接到了 N 份工作,每份工作恰好占用他一天的时间.约翰从第一天开始工作,他可以任意安排这些工作的顺序,第 i 份工作有 Pi 的报酬,但必须在第 Di 天结束之前完成.在截止日期后完成的工作没有报酬.请帮助约翰规划每天的工作,使得他赚到的钱最多. 1 ≤ N ≤ 105  , 1 ≤ Di ,Pi ≤ 109     这题就恶心在数据范围额. 解题过程: 1.这题寒假做贪心专题的时候做到过,贪心策略大致还记得,就是先按照报酬P从大到小排序,然后

【赵强老师】Docker Swarm集群的数据持久化

如果Docker Swarm集群中运行了mysql.nginx等服务,这些服务的数据如果没有挂载到宿主机中,那么容器一旦停止运行,那就意味着数据丢失. 有什么方法可以解决swarm集群中运行的服务能够数据持久化呢?我们可以通过volme.nfs等方法来实现swarm集群应用数据持久化,其实也和docker数据持久化的形式是一样的. 可以用两种方式来实现: volume 默认模式:工作节点宿主机数据同步到容器内. volume NFS 共享存储模式:管理节点宿主同步到工作节点宿主,工作节点宿主同步

Oracle数据库集群入门培训教程_Oracle RAC集群体系架构解析

课程目标 风哥本课程讲解Oracle数据库基础入门培训教程之Oracle RAC集群体系架构,内容包括:集群基本概念.Oracle RAC集群架构.Oracle RAC集群相关术语.Oracle RAC集群相关进程.Oracle RAC集群技术不同版本的变化 适用人群 IT相关从业人员,Oracle dba,在校大学生 课程简介 风哥本课程讲解Oracle数据库基础入门培训教程之Oracle RAC集群体系架构,内容包括: 一.本课内容 01.Oracle集群有哪几种 02.Oracle集群基本

搭建高可用mongodb集群(三)—— 深入副本集内部机制

http://www.lanceyan.com/tech/mongodb_repset2.html 在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的?能否手动干涉下架某一台主节点. 官方说副本集数量最好是奇数,为什么? mongodb副本集是如何同步的?如果同步不及时会出现什么情况?会不会出现不一致性? mongodb的故障转移会不会无故自动发生?什么条件会

Hadoop集群配置心得(低配置集群+自动同步配置)

本文为本人原创,首发到炼数成金 http://f.dataguru.cn/thread-138720-1-1.html. 情况是这样的,我没有一个非常强劲的电脑来搞出一个性能非常NB的服务器集群,相信很多人也跟我差不多,所以现在把我的低配置集群经验拿出来写一下好了. 我的配备:1)五六年前的赛扬单核处理器2G内存笔记本 2)公司给配的ThinkpadT420,i5双核处理器4G内存(可用内存只有3.4G,是因为装的是32位系统的缘故吧...) 就算是用公司配置的电脑,做出来三台1G内存的虚拟机也