并查集,如果只是朴素的路径压缩,那么也就是一句话的事情。

  但是,一般都没有这种仁慈的裸题(假的,多了去了)

  1988:带权并查集,贼鸡儿像Luogu的那道杨威利的并查集(好像是叫银河英雄传说)

  开两个数组,down[x]表示标号为x的箱子下面有多少个箱子,len[x]表示以x点为根(即被压在最底部的箱子)的箱子总个数是多少。

  因此我们在合并时,要把fx的父节点更新为fy,同时还要更新down[fx]和len[fy]。当然,最容易忽略的是把len[fx]清零。

  对于具体的down[x]的更新,只需要在getfather的时候递归操作即可。

  CODE

#include<cstdio>
using namespace std;
const int N=;
int down[N],len[N],father[N],n,p,i,x,y;
char opt;
inline void read(int &x)
{
x=; int flag=; char ch=getchar();
while (ch<''||ch>'') { if (ch=='-') flag=-; ch=getchar(); }
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
x*=flag;
}
inline void write(int x)
{
if (x<) putchar('-'),x=-x;
if (x/) write(x/);
putchar(x%+'');
}
inline int getfather(int k)
{
if (father[k]==k) return k;
int fa=father[k];
father[k]=getfather(father[k]);
down[k]+=down[fa];
return father[k];
}
int main()
{
read(p);
for (i=;i<N;++i)
father[i]=i,len[i]=,down[i]=;
while (p--)
{
while (opt=getchar(),opt!='M'&&opt!='C') opt=getchar();
if (opt=='M')
{
read(x),read(y);
int fx=getfather(x),fy=getfather(y);
if (fx!=fy)
{
father[fx]=fy;
down[fx]+=len[fy];
len[fy]+=len[fx];
len[fx]=;
}
} else read(x),getfather(x),write(down[x]),putchar('\n');
}
return ;
}

  2236:一道基础的并查集维护联通关系的题目。

  每打开一台计算机,就扫描过其他所有的打开的计算机。如果他们之间的距离小于等于d就合并。

  查询的时候并查集查询father即可。

  CODE

#include<cstdio>
using namespace std;
const int N=;
int x[N],y[N],n,d,father[N],i,num,a,b;
bool vis[N];
char opt;
inline void read(int &x)
{
x=; char ch=getchar(); int flag=;
while (ch<''||ch>'') { if (ch=='-') flag=-; ch=getchar(); }
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
x*=flag;
}
inline int getfather(int k)
{
return father[k]==k?k:father[k]=getfather(father[k]);
}
int main()
{
read(n); read(d);
for (i=;i<=n;++i)
read(x[i]),read(y[i]),father[i]=i;
while (scanf("%c",&opt)!=EOF)
{
if (opt=='O')
{
read(num);
if (vis[num]) continue;
vis[num]=;
for (i=;i<=n;++i)
{
if (num==i) continue;
if (vis[i]&&(x[i]-x[num])*(x[i]-x[num])+(y[i]-y[num])*(y[i]-y[num])<=d*d) father[getfather(i)]=getfather(num);
}
} else
{
read(a); read(b);
if (!vis[a]||!vis[b]) { puts("FAIL"); continue; }
if (getfather(a)==getfather(b)) puts("SUCCESS"); else puts("FAIL");
}
}
return ;
}

POJ 1988&&2236的更多相关文章

  1. poj.1988.Cube Stacking(并查集)

    Cube Stacking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submi ...

  2. POJ 1988 Cube Stacking(带权并查集)

    Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 23678   Accepted: 8299 Ca ...

  3. 【POJ 1988】 Cube Stacking (带权并查集)

    Cube Stacking Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)id ...

  4. poj 1988 并查集(终于看懂一个了/(ㄒoㄒ)/~~)

    题意:有几个stack,初始里面有一个cube.支持两种操作:1.move x y: 将x所在的stack移动到y所在stack的顶部.2.count x:数在x所在stack中,在x之下的cube的 ...

  5. POJ 1988 Cube Stacking(并查集+路径压缩)

    题目链接:id=1988">POJ 1988 Cube Stacking 并查集的题目 [题目大意] 有n个元素,開始每一个元素自己 一栈.有两种操作,将含有元素x的栈放在含有y的栈的 ...

  6. POJ 1988 Cube Stacking( 带权并查集 )*

    POJ 1988 Cube Stacking( 带权并查集 ) 非常棒的一道题!借鉴"找回失去的"博客 链接:传送门 题意: P次查询,每次查询有两种: M x y 将包含x的集合 ...

  7. POJ 1988 Cube Stacking (种类并查集)

    题目地址:POJ 1988 这道题的查找合并的方法都能想的到,就是一点没想到,我一直天真的以为查询的时候,输入后能立即输出,这种话在合并的时候就要所有的结点值都要算出来,可是经过路径压缩之后,没办法所 ...

  8. [POJ 1988] Cube Stacking (带值的并查集)

    题目链接:http://poj.org/problem?id=1988 题目大意:给你N个方块,编号从1到N,有两种操作,第一种是M(x,y),意思是将x所在的堆放到y所在的堆上面. 第二种是C(x) ...

  9. 有权并查集,Poj(1988)

    题目链接:http://poj.org/problem?id=1988 题目大意: 有n个从1到n编号的箱子,将每个箱子当做一个栈,对这些箱子进行p次操作,每次操作分别为以下两种之一: 输入 M x ...

随机推荐

  1. 解决ci框架php发送邮件附件中文乱码问题

    CI框架发送邮件附件中文出现乱码,是因为php basename()函数不支持中文引起,修改类库 Email.php 文件中 _append_attachments()方法,大致在 1474行 添加如 ...

  2. 安卓ADB命令

    查看连接的设备 adb devices -l FastBoot常用命令: fastboot erase system    #擦除system分区 fastboot erase boot    #擦除 ...

  3. 准备好要上传到 Azure 的 Windows VHD 或 VHDX

    在将 Windows 虚拟机 (VM) 从本地上传到 Azure 之前,必须准备好虚拟硬盘(VHD 或 VHDX). Azure 仅支持采用 VHD 文件格式且具有固定大小磁盘的第 1 代 VM. V ...

  4. Content-Length和body_bytes_sent

    [map@cq01-map-lbsop-hbase conf]$ curl 'http://10.46.43.14:8100/50x.html' -v* About to connect() to 1 ...

  5. python web编程CGI

    CGI(通用网关接口),CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能. CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行 ...

  6. 邮件客户端修改密码—OWA

    邮件客户端修改密码—OWA 1.登录OWA 2.输入用户名 3.点击选项 4.更改密码

  7. 阿里八八Alpha阶段Scrum(1/12)

    任务分配 叶文滔:整体框架UI设计.作为组长进行任务协调 俞鋆:后端服务器及数据库搭建 王国超:日程模块多日显示部分设计 黄梅玲:日程模块单日显示部分设计 林炜鸿:日程模块文本添加部分设计 张岳.刘晓 ...

  8. String真的是不可变的吗?

    你可能问一个人String是可变的吗?想必他们都会一口同生的说String是不可变的,因为String是final修饰的,而且它底层的是final修饰的char[]数组. 可以看到String源码: ...

  9. [python]如何理解uiautomator里面的 instance 及使用场景

    通过uiautomatorviewer打开之后,需要通过对某个控件进行操作,但在当前界面中该控件所有属性无法唯一(其它控件属性也是一样),这个时候就需要借助实例(instance)来进行区分,inst ...

  10. Python接口自动化--requests 2

    # _*_ encoding:utf-8 _*_ import json import requests #post请求 payload = {"cindy":"hell ...