并查集乱搞 bzoj1015

建图建错4次 改了2个钟。。。这本是道水题。。。

 1 program hehe;
 2 type
 3  edge=record
 4   q,z,next:longint;
 5  end;
 6 var
 7  n,m,q,i,j,k,cnt:longint;
 8  p,pd:array[0..500000] of boolean;
 9  e:array[0..500000] of edge;
10  ans,c,first,f,d:array[0..500000] of longint;
11
12   function find(a:longint):longint;
13   begin
14    if f[a]=a then exit(a);
15    f[a]:=find(f[a]);
16    exit(f[a]);
17   end;
18
19 begin
20  fillchar(first,sizeof(first),255);
21  fillchar(e,sizeof(e),255);
22  fillchar(p,sizeof(p),true);
23  read(n,m);
24  for i:=0 to n-1 do
25  f[i]:=i;
26  for i:=1 to m do
27  begin
28   read(j,k);
29   if first[j]=-1 then
30   first[j]:=i;
31   e[i].q:=j;
32   e[i].z:=k;
33   e[c[j]].next:=i;
34   c[j]:=i;
35   if first[k]=-1 then
36   first[k]:=i+m;
37   e[i+m].q:=j;
38   e[i+m].z:=k;
39   e[c[k]].next:=i+m;
40   c[k]:=i+m;
41  end;
42  read(q);
43  for i:=1 to q do
44  begin
45   read(d[q-i+1]);
46   p[d[q-i+1]]:=false;
47  end;
48  for i:=0 to n-1 do
49  if p[i] then inc(cnt);
50  for i:=0 to n-1 do
51  if p[i] then
52  begin
53   k:=first[i];
54   while k<>-1 do
55   begin
56    if (p[e[k].q])and(p[e[k].z]) then
57    if find(e[k].q)<>find(e[k].z) then
58    begin
59     f[find(e[k].q)]:=find(e[k].z);
60     dec(cnt);
61    end;
62    k:=e[k].next;
63   end;
64  end;
65  ans[0]:=cnt;
66  for i:=1 to q do
67  begin
68   inc(cnt);
69   p[d[i]]:=true;
70   k:=first[d[i]];
71   while k<>-1 do
72   begin
73    if (p[e[k].q])and(p[e[k].z]) then
74    if find(e[k].q)<>find(e[k].z) then
75    begin
76     f[find(e[k].q)]:=find(e[k].z);
77     dec(cnt);
78    end;
79    k:=e[k].next;
80   end;
81   ans[q-i+1]:=cnt;
82  end;
83  for i:=1 to q do
84  writeln(ans[i]);
85  writeln(ans[0]);
86 end.

1015: [JSOI2008]星球大战starwar

Time Limit: 3 Sec  Memory Limit: 162 MB
Submit: 3484  Solved: 1554
[Submit][Status][Discuss]

Description

很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。 但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。

Input

输入文件第一行包含两个整数,N (1 <= N <= 2M) 和M (1 <= M <= 200,000),分别表示星球的数目和以太隧道的数目。星球用0~N-1的整数编号。接下来的M行,每行包括两个整数X, Y,其中(0<=X<>Y

Output

输出文件的第一行是开始时星球的连通块个数。接下来的N行,每行一个整数,表示经过该次打击后现存星球的连通块个数。

Sample Input

8 13
0 1
1 6
6 5
5 0
0 6
1 2
2 3
3 4
4 5
7 1
7 2
7 6
3 6
5
1
6
3
5
7

Sample Output

1
1
1
2
3
3

HINT

Source

[Submit][Status][Discuss]

时间: 2024-10-27 08:31:11

并查集乱搞 bzoj1015的相关文章

bzoj1050 并查集乱搞

impossible打错.. 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define rep(i,l,r) for(int i=l;i<r;i++) 6 #define clr(a,x) memset(a,x,sizeof(a)) 7 using namespace std; 8 struct edge{ 9 int q,z,

Codeforces Round #286 div.1 D 506D D. Mr. Kitayuta&#39;s Colorful Graph【并查集】

题目链接:http://codeforces.com/problemset/problem/506/D 题目大意: 给出n个顶点,m条边,每条边上有一个数字,代表某个颜色.不同数字代表不同的颜色.有很多个询问,每个询问问有多少条纯种颜色的路径使得某两个点联通. 分析: 这个题一看就想用并查集来搞,每种颜色用一个并查集处理.对于输入的每条边,我们只需要将这两个点在这条边的颜色对应的并查集中合并就好了.查询的时候,我们只需要检测这两个点在多少个颜色对应的并查集中是在统一集合中的,那么就有多少条纯种颜

[BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)

传送门 题中重要信息,每堆草的数量都不一样. 可以思考一下,什么情况下才会出现矛盾. 1.如果两个区间的最小值一样,但是这两个区间没有交集,那么就出现矛盾. 2.如果两个区间的最小值一样,并且这两个区间有交集,那么这个最小值一定在交集中,但是如果这个交集被某个最小值较大的区间,或是一些最小值较大的区间的并集包含,那么也是矛盾的. 可以二分答案,将这些区间按照最小值从大到小排序,然后可以用线段树维护,也可以用并查集来搞. 下面是用并查集来搞的. 每到一个区间,可以将[l,r]中的f变成r+1,如果

并查集总结篇

1.模板题poj1611the suspects 每个组内的人,同一个组内都是感染者,问与"0"号人有关的有多少人 #include <iostream> #include<cstdio> using namespace std; const int MAXN = 1000100; struct DS { int f[MAXN]; void init(int n) { for(int i=0;i<n;i++) f[i]=i; } int ff(int x)

「UVA 11987」Almost Union-Find 「带权并查集」「思维」

你发现,这个第二个操作不可能用普通并查集来搞,很棘手 但是你考虑一下,并查集维护的是个森林结构,并且路径压缩的时候每个森林的根是不会变的, 也就是意味着每删掉一个点你需要让他的踪影消失匿迹即可,并不需要让他在原有的树结构上消失. 具体怎么消失?把贡献全在根上减掉即可,再新建一个新点连进去. 这个新点可以用id数组表示,即id[x]为x节点现在的编号. #include <bits/stdc++.h> #define test(...) fprintf(stderr, __VA_ARGS__)

【BZOJ-4668】冷战 并查集 + 启发式合并 + 乱搞

4668: 冷战 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 37  Solved: 24[Submit][Status][Discuss] Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争.在这段时期,虽然分歧和冲突严重,但双方都尽力避免世界范围的大规模战争(第三次世界大战)爆发

BZOJ1015[JSOI2008]星球大战starwar[并查集]

1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 5253  Solved: 2395[Submit][Status][Discuss] Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道互相直接或间接地连接. 但好景不长,很快帝国又重

学渣乱搞系列之Tarjan模板合集

学渣乱搞系列之Tarjan模板合集 by 狂徒归来 一.求强连通子图 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #incl

BZOJ1015 [JSOI2008]星球大战starwar(并查集)

1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3895  Solved: 1750[Submit][Status][Discuss] Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道互相直接或间接地连接. 但好景不长,很快帝国又重