shz
pku 2985 The k-th Largest Group
1
#include
<
iostream
>
2
#define
max 200005
3
using
namespace
std;
4
int
set
[max],rank[max];
5
int
n,m,num1,num2;
6
struct
7
{
8
int
left;
9
int
right;
10
int
num;
11
}
tree[max
*
3
];
12
int
findset(
int
x)
13
{
14
if
(
set
[x]
!=
x)
15
set
[x]
=
findset(
set
[x]);
16
return
set
[x];
17
}
18
void
Init(
int
n)
19
{
20
int
i;
21
for
(i
=
1
;i
<=
n;i
++
)
22
{
23
rank[i]
=-
1
;
24
set
[i]
=
i;
25
}
26
}
27
28
void
link(
int
a,
int
b)
29
{
30
int
tmp
=
rank[a]
+
rank[b];
31
if
(rank[a]
<
rank[b])
32
{
33
set
[b]
=
a;
34
rank[a]
=
tmp;
35
}
36
else
37
{
38
set
[a]
=
b;
39
rank[b]
=
tmp;
40
}
41
}
42
void
Union(
int
a,
int
b)
43
{
44
link(findset(a),findset(b));
45
}
46
void
Creat(
int
l,
int
r,
int
p)
47
{
48
49
tree[p].left
=
l;
50
tree[p].right
=
r;
51
if
(l
==
1
) tree[p].num
=
n;
52
else
tree[p].num
=
0
;
53
if
(l
==
r)
return
;
54
int
mid
=
(l
+
r)
/
2
;
55
Creat(l,mid,
2
*
p);
56
Creat(mid
+
1
,r,
2
*
p
+
1
);
57
}
58
void
find(
int
p,
int
k)
59
{
60
if
(tree[p].left
==
tree[p].right)
61
{
62
printf(
"
%d\n
"
,tree[p].left);
63
return
;
64
}
65
if
(tree[
2
*
p].num
<
k)
66
find(
2
*
p
+
1
,k
-
tree[
2
*
p].num);
67
else
68
find(
2
*
p,k);
69
}
70
void
delet(
int
x,
int
p)
71
{
72
tree[p].num
--
;
73
if
(tree[p].left
==
tree[p].right)
return
;
74
if
(x
<=
tree[
2
*
p].right)
75
delet(x,
2
*
p);
76
else
77
delet(x,
2
*
p
+
1
);
78
}
79
void
add(
int
x,
int
p)
80
{
81
tree[p].num
++
;
82
if
(tree[p].left
==
tree[p].right)
return
;
83
if
(x
<=
tree[
2
*
p].right)
84
add(x,
2
*
p);
85
else
86
add(x,
2
*
p
+
1
);
87
}
88
int
main()
89
{
90
int
i,j,c,k;
91
while
(scanf(
"
%d%d
"
,
&
n,
&
m)
!=
EOF)
92
{
93
Init(n);
94
Creat(
1
,n,
1
);
95
while
(m
--
)
96
{
97
scanf(
"
%d
"
,
&
c);
98
if
(c
==
1
)
99
{
100
scanf(
"
%d
"
,
&
k);
101
find(
1
,tree[
1
].num
-
k
+
1
);
102
}
103
else
104
{
105
scanf(
"
%d%d
"
,
&
i,
&
j);
106
if
(findset(i)
!=
findset(j))
107
{
108
delet(
-
rank[
set
[i]],
1
);
109
delet(
-
rank[
set
[j]],
1
);
110
add(
-
rank[
set
[i]]
-
rank[
set
[j]],
1
);
111
Union(i,j);
112
}
113
}
114
}
115
}
116
return
0
;
117
}
118
119
posted on 2008-02-21 18:59
shengzan
阅读(226)
评论(1)
编辑
收藏
引用
Feedback
#
re: pku 2985 The k-th Largest Group
2008-02-21 19:03
shengzan
en
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
博客园最新博文
博问
管理
My Links
C++博客
首页
联系
聚合
管理
Blog Stats
Posts - 0
Stories - 2
Comments - 1
Trackbacks - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
文章档案
2008年2月 (2)
搜索
最新评论
1. re: pku 2985 The k-th Largest Group
en
--shengzan