bzoj 1455 可并堆+并查集
2024-10-15 18:45:06
一个堆和一个并查集对应,并且满足并查集中所有没有死的人等于堆中的人
/**************************************************************
Problem: 1455
User: idy002
Language: C++
Result: Accepted
Time:2688 ms
Memory:32336 kb
****************************************************************/ #include <cstdio>
#define N 1000010 struct Node {
int u, w, s;
Node *ls, *rs;
void update() {
s = ;
if( ls ) s += ls->s;
if( rs ) s += rs->s;
}
}pool[N], *tail=pool, *root[N]; int n, m;
int fat[N], die[N]; int find( int a ) {
return a==fat[a] ? a : fat[a]=find(fat[a]);
}
Node *newnode( int u, int w ) {
Node *nd = ++tail;
nd->u = u;
nd->w = w;
nd->ls = nd->rs = ;
return nd;
}
Node *smerge( Node *na, Node *nb ) {
if( !na && !nb ) return ;
if( !na ) return nb;
if( !nb ) return na;
if( na->w < nb->w ) {
na->rs = smerge( na->rs, nb );
na->update();
return na;
} else {
nb->rs = smerge( nb->rs, na );
nb->update();
return nb;
}
}
int main() {
scanf( "%d", &n );
for( int i=,w; i<=n; i++ ) {
scanf( "%d", &w );
root[i] = newnode(i,w);
fat[i] = i;
}
scanf( "%d", &m );
for( int i=,u,v; i<=m; i++ ) {
char ch[];
scanf( "%s", ch );
if( ch[]=='M' ) {
scanf( "%d%d", &u, &v );
if( die[u] || die[v] ) continue;
int fu = find(u);
int fv = find(v);
if( fu==fv ) continue;
fat[fu] = fv;
root[fv] = smerge( root[fu], root[fv] );
} else {
scanf( "%d", &u );
if( die[u] ) {
printf( "0\n" );
continue;
}
int fu = find(u);
int v = root[fu]->u;
printf( "%d\n", root[fu]->w );
die[v] = true;
root[fu] = smerge( root[fu]->ls, root[fu]->rs );
}
}
}
最新文章
- table中某一个tr边框样式设置
- 黄聪:C#Winform程序如何发布并自动升级(图解)
- ViewManager
- Dual Palindromes
- MBB类似jquery.bxslider插件轮播效果
- WebKit渲染基础(转载 学习中。。。)
- 初始化css代码需要注意的
- 【原创】java 流星划过天空
- 输出图像到文件 imwrite()[OpenCV 笔记7]
- 存储过程与SQL的结合使用
- js在新页面中返回到上一页浏览的历史位置
- js函数一些小的知识点
- ThreadPoolExecutor的运转机制
- layer.load的使用
- string函数的一些实现
- JS库汇总[重要]
- Visual Studio 2013更新内容简介
- 如何用Javascript检测到所有的IE版本
- Mac安装mtr与brow安装
- Python全栈day10(运算符)