ZOJ 3789 并查集
2016-05-26 20:15
477 查看
点击打开链接
题意:只说那几个操作把,L将u与v连接,若u左旋,则v右旋,不会出现不合法的条件,Q问u与v的关系,若已知的条件不能判断在则Unknown,旋转方向不一样则Different,一样则Same,然后还有个查询S,问当前u所在的集合的元素个数,D则为删除,但删除后不改变集合其它元素的关系
思路:这题的方向我们可以用到根节点距离来表示,而距离的统计可以直接在路径压缩时完成,元素个数在合并时也可以完成,有点不好想的是这个删除的操作的办法,因为在删除时有可能就将根节点删除了,那么我们可以在找一个数来代替要删除的这个数,而之前的根节点保持不动就行了,加一个数组保存即可
题意:只说那几个操作把,L将u与v连接,若u左旋,则v右旋,不会出现不合法的条件,Q问u与v的关系,若已知的条件不能判断在则Unknown,旋转方向不一样则Different,一样则Same,然后还有个查询S,问当前u所在的集合的元素个数,D则为删除,但删除后不改变集合其它元素的关系
思路:这题的方向我们可以用到根节点距离来表示,而距离的统计可以直接在路径压缩时完成,元素个数在合并时也可以完成,有点不好想的是这个删除的操作的办法,因为在删除时有可能就将根节点删除了,那么我们可以在找一个数来代替要删除的这个数,而之前的根节点保持不动就行了,加一个数组保存即可
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; const int inf=0x3f3f3f3f; const ll INF=0x3f3f3f3f3f3f3f3fll; const int maxn=1000010; int f[maxn],dis[maxn],num[maxn],ff[maxn]; int find1(int x){ if(x==f[x]) return f[x]; int t=f[x]; f[x]=find1(f[x]); dis[x]+=dis[t]; return f[x]; } void unite(int a,int b){ int aa=find1(a); int bb=find1(b); if(aa==bb) return ; f[aa]=bb; num[bb]+=num[aa]; dis[aa]=dis[b]+dis[a]+1; } int main(){ int n,m,u,v; char ch[10]; while(scanf("%d%d",&n,&m)!=-1){ for(int i=0;i<=maxn;i++){ f[i]=ff[i]=i;dis[i]=0;num[i]=1; } for(int i=0;i<m;i++){ scanf("%s",ch); if(ch[0]=='L'){ scanf("%d%d",&u,&v); unite(ff[u],ff[v]); }else if(ch[0]=='Q'){ scanf("%d%d",&u,&v); if(find1(ff[u])!=find1(ff[v])) printf("Unknown\n"); else if(dis[ff[u]]%2==dis[ff[v]]%2) printf("Same\n"); else printf("Different\n"); }else if(ch[0]=='S'){ scanf("%d",&u); int ans=find1(ff[u]); printf("%d\n",num[ans]); }else if(ch[0]=='D'){ scanf("%d",&u); int ans=find1(ff[u]); num[ans]--; ff[u]=++n; num =1;f =n;dis =0; } } } return 0; }
相关文章推荐
- JAVA NIO技术(上)
- JSON.parse解析json数据及取值的几种方式
- codechef Prime Distance On Tree(树分治+FFT)
- 数据结构之排序一
- arp协议
- 软件特点
- Android应用安全开发之浅谈网页打开APP
- SQL注入测试平台 SQLol -3.INSERT注入测试
- 【leetcode】268. Missing Number
- 山东环保数据库迁移
- 自动识别验证码开发
- vim打开文件时提示Taglist: Exuberant ctags (http://ctags.sf.net) not found in PATH. Plugin is not loaded.
- mybatis系列-09-订单商品数据模型
- win10系统右下角调节声音的小喇叭不见了解决方法
- 福尔摩斯探集
- 跳表Java实现
- Syscalls used by malloc
- android 资源的整合(待续)
- nyoj 737 石子合并(一) 区间dp
- Computer Architecture