
BZOJ3674: 可持久化并查集加强版&&BZOJ3673: 可持久化并查集 by zky
发布日期:2021-05-06 03:47:13
浏览次数:19
分类:技术文章
本文共 5475 字,大约阅读时间需要 18 分钟。
妈个鸡。。。。没加强的没有要求在线。。。
我日了狗了 查了半天错。。。。
反正就是用可持久化线段树维护一个可持久化数组具体看代码
/************************************************************** Problem: 3674 User: liutian Language: C++ Result: Accepted Time:1424 ms Memory:180884 kb****************************************************************/ #include#include #include using namespace std; char c;inline void read(int &a){a=0;do c=getchar();while(c<'0'||c>'9');while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();} struct Node{Node *lc,*rc;int data;}*Tree[2000001];Node a [10000001];Node* st[10000001];int con_d;inline void begin(){for(con_d=0;con_d<=10000000;con_d++)st[con_d]=&a[con_d];con_d--;}inline Node *New_Node(){st[con_d]->lc=NULL;st[con_d]->rc=NULL;return st[con_d--];}int timeee;int n;inline int f(Node *a,int l,int r,int pl){ if(l^r) { int mid=(l+r)>>1; if(mid rc,mid+1,r,pl); return f(a->lc,l,mid,pl); } return a->data;}Node *change(Node *a,int l,int r,int pl,int delta){ if(l^r) { int mid=(l+r)>>1; Node *tp=New_Node(); *tp=*a; if(mid rc=change(tp->rc,mid+1,r,pl,delta); else tp->lc=change(tp->lc,l,mid,pl,delta); return tp; } Node *tp=New_Node(); tp->data=delta;return tp;}#define f(x) f(Tree[timeee],1,n,x) int find(int x){ int res,t; t=f(x); if((res=f(t))!=t) Tree[timeee]=change(Tree[timeee],1,n,x,res=find(t)); return res;} Node* build_start(int l,int r){ Node*a=New_Node(); if(l^r) { int mid=(l+r)>>1; a->lc=build_start(l,mid); a->rc=build_start(mid+1,r); return a; } a->data=l; return a;} int main(){ int m,lastans=0; read(n),read(m);begin(); Tree[0]=build_start(1,n); int flag,j,k,f1,f2; for(int i=1;i<=m;i++) { read(flag); if(flag==1) { timeee=i; Tree[i]=Tree[i-1]; read(j),read(k); j^=lastans,k^=lastans; f1=find(j);f2=find(k); if(f1!=f2)Tree[i]=change(Tree[i],1,n,f1,f2); } if(flag==2) { read(j); j^=lastans; timeee=i; Tree[i]=Tree[j]; } if(flag==3) { timeee=i; read(j),read(k); Tree[i]=Tree[i-1]; j^=lastans;k^=lastans; f1=find(j),f2=find(k); if(f1==f2) putchar('1'),putchar('\n'),lastans=1; else putchar('0'),putchar('\n'),lastans=0; } } return 0;}
/************************************************************** Problem: 3673 User: liutian Language: C++ Result: Accepted Time:144 ms Memory:64552 kb****************************************************************/ #include#include #include using namespace std; char c;inline void read(int &a){a=0;do c=getchar();while(c<'0'||c>'9');while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();} struct Node{Node *lc,*rc;int data;}*Tree[200001];Node a [4000001];Node* st[4000001];int con_d;inline void begin(){for(con_d=0;con_d<=4000000;con_d++)st[con_d]=&a[con_d];con_d--;}inline Node *New_Node(){st[con_d]->lc=NULL;st[con_d]->rc=NULL;return st[con_d--];}int timeee;int n;inline int f(Node *a,int l,int r,int pl){ if(l^r) { int mid=(l+r)>>1; if(mid rc,mid+1,r,pl); return f(a->lc,l,mid,pl); } return a->data;}Node *change(Node *a,int l,int r,int pl,int delta){ if(l^r) { int mid=(l+r)>>1; Node *tp=New_Node(); *tp=*a; if(mid rc=change(tp->rc,mid+1,r,pl,delta); else tp->lc=change(tp->lc,l,mid,pl,delta); return tp; } Node *tp=New_Node(); tp->data=delta;return tp;}#define f(x) f(Tree[timeee],1,n,x) int find(int x){ int res,t; t=f(x); if((res=f(t))!=t) Tree[timeee]=change(Tree[timeee],1,n,x,res=find(t)); return res;} Node* build_start(int l,int r){ Node*a=New_Node(); if(l^r) { int mid=(l+r)>>1; a->lc=build_start(l,mid); a->rc=build_start(mid+1,r); return a; } a->data=l; return a;} int main(){ int m,lastans=0; read(n),read(m);begin(); Tree[0]=build_start(1,n); int flag,j,k,f1,f2; for(int i=1;i<=m;i++) { read(flag); if(flag==1) { timeee=i; Tree[i]=Tree[i-1]; read(j),read(k);// j^=lastans,k^=lastans; f1=find(j);f2=find(k); if(f1!=f2)Tree[i]=change(Tree[i],1,n,f1,f2); } if(flag==2) { read(j);// j^=lastans; timeee=i; Tree[i]=Tree[j]; } if(flag==3) { timeee=i; read(j),read(k); Tree[i]=Tree[i-1];// j^=lastans;k^=lastans; f1=find(j),f2=find(k); if(f1==f2) putchar('1'),putchar('\n'),lastans=1; else putchar('0'),putchar('\n'),lastans=0; } } return 0;}
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月14日 01时47分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
继承和派生1
2019-03-01
约瑟夫环问题
2019-03-01
CF #716 (Div. 2) B. AND 0, Sum Big(思维+数学)
2019-03-01
阿里云数据库连接MySql
2019-03-01
Java 設計模式 - 建造者模式
2019-03-01
ES6 JavaScript 重新認識 Promise
2019-03-01
Spring--04--AOP增强
2019-03-01
2020-07-16:如何获得一个链表的倒数第n个元素?
2019-03-01
2020-12-10:i++是原子操作吗?为什么?
2019-03-01
2021-01-21:java中,HashMap的读流程是什么?
2019-03-01
Imagination官方信息速递2021年光线追踪专刊
2019-03-01
计算机视觉中的双目立体视觉和体积度量
2019-03-01
什么是数据中心,它们是如何变化的?
2019-03-01
webpack01 -- webpack安装和配置
2019-03-01
分享九款不同页面404源码html
2019-03-01
404页圈小猫游戏代码
2019-03-01
好看清新卡通人物404单页网站源码
2019-03-01
简洁仿t猫404页html源码
2019-03-01