POJ 1988/bzoj3376[Usaco2004 Open]Cube Stacking 方块游戏
来源:互联网 发布:c 高级编程视频教程 编辑:程序博客网 时间:2024/06/05 14:06
嘛 又是一道带权并查集
不过这题要带多一点好玩的东西
f[x]表示其所在树根不用说 然后多设一个d[x]表示当前积木块最底端的是哪个 p[x]表示在x上面有多少个
求值的时候就p[d[x]]-p[x]就好
记得修改完要更新啊 因为有些地方是下面也要更新的 比如 你说呢?(这个自己想想~)
不懂就看代码咯。。
#include<cmath>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;const int N=30002,inf=1e9;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} return x*f;}int f[N],p[N],d[N];int fa(int x){ if(x==f[x])return x; int y=f[x]; f[x]=fa(f[x]),d[x]=d[y],p[x]+=p[y]; return f[x];}int main(){ int i,x,y,fx,fy,m=read(); char ch; for(i=1;i<N;i++)d[i]=f[i]=i,p[i]=0; while(m--) { scanf("\n%c",&ch); if(ch=='M') { x=read(),y=read(),fx=fa(x),fy=fa(y); int k=fa(d[fx]); f[fy]=fx,p[fy]=p[d[fx]]+1,d[fx]=d[fy]; } else { x=read(),fx=fa(x); int k=fa(d[fx]); printf("%d\n",p[d[x]]-p[x]); } } return 0;}
1 0
- POJ 1988/bzoj3376[Usaco2004 Open]Cube Stacking 方块游戏
- bzoj3376 [Usaco2004 Open]Cube Stacking 方块游戏
- bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏
- bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集
- 3376: [Usaco2004 Open]Cube Stacking 方块游戏
- BZOJ 3376: [Usaco2004 Open]Cube Stacking 方块游戏
- bzoj 3376: [Usaco2004 Open]Cube Stacking 方块游戏 带权并查集
- poj 1988 Cube Stacking
- poj 1988 Cube Stacking
- poj 1988 Cube Stacking
- POJ-1988 Cube Stacking
- POJ 1988 Cube Stacking
- POJ 1988 Cube Stacking
- POJ 1988 Cube Stacking
- poj 1988 Cube Stacking
- POJ 1988 Cube Stacking
- POJ 1988 Cube Stacking
- poj 1988 Cube Stacking
- Java中的策略模式(strategy)完全解析
- linux 配置环境变量
- PHPMailer 发送邮件
- iOS开发中使用代码控制横竖屏的切换
- 性能优化1: 能在一个循环内处理的事情,不要分成多个循环
- POJ 1988/bzoj3376[Usaco2004 Open]Cube Stacking 方块游戏
- UIStoryboard的简单封装
- Makefile详解-书写规则
- 2017第一季度计划
- 大数据学习笔记-------------------(30)
- log4j 配置数据库连接池添加自定义信息
- 1102学习记录 扑克牌类实现
- find和grep查找字符串
- 一些运算符号的优先级