题解

给定一张图,支持删点和询问连通块个数

按操作顺序处理的话要在删除点的同时维护图的形态(即图具体的连边情况),这是几乎不可做的

我们发现,这道题可以先读入操作,把没删的点的边先连上,然后再倒序处理操作

这样的话从删点变成了加点,而且只要维护连通块的数量,用并查集可以快速的解决这个问题

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 4 * 200000;
  4. int n, m, q[maxn];
  5. vector<int> G[maxn];
  6. int fa[maxn], added[maxn], des[maxn], ans[maxn];
  7. int tot = 0;
  8. int find(int x) { return fa[x] = fa[x] == x ? x : find(fa[x]); }
  9. void add(int x) {
  10. int p = find(x), q;
  11. added[x] = 1;
  12. for (int i = 0; i < G[x].size(); i++) {
  13. if (added[G[x][i]]) {
  14. q = find(G[x][i]);
  15. if (p != q) {
  16. fa[q] = p;
  17. tot--; //连通块少一个
  18. }
  19. }
  20. }
  21. }
  22. int main() {
  23. // freopen("input", "r", stdin);
  24. scanf("%d %d", &n, &m);
  25. for (int i = 1; i <= m; i++) {
  26. int x, y;
  27. scanf("%d %d", &x, &y);
  28. G[x].push_back(y);
  29. G[y].push_back(x);
  30. }
  31. memset(added, 0, sizeof(added));
  32. for (int i = 0; i < n; i++)
  33. fa[i] = i;
  34. int d;
  35. scanf("%d", &d);
  36. for (int i = 1; i <= d; i++) {
  37. scanf("%d", &q[i]);
  38. des[q[i]] = 1;
  39. }
  40. for (int i = 0; i < n; i++) {
  41. if (!des[i]) {
  42. tot++;
  43. add(i);
  44. added[i] = 1;
  45. }
  46. }
  47. ans[d + 1] = tot;
  48. for (int i = d; i > 0; i--) {
  49. tot++; //连通块多一个
  50. add(q[i]);
  51. added[q[i]] = 1;
  52. ans[i] = tot;
  53. }
  54. for (int i = 1; i <= d + 1; i++)
  55. printf("%d\n", ans[i]);
  56. return 0;
  57. }

[bzoj1015][JSOI2008]星球大战——并查集+离线处理的更多相关文章

  1. BZOJ-1015 StarWar星球大战 并查集+离线处理

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 4105 Solved: 1826 [Submit ...

  2. 洛谷P1197 [JSOI2008] 星球大战 [并查集]

    题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ...

  3. JSOI2008 星球大战 [并查集]

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...

  4. P1197 [JSOI2008]星球大战[并查集+图论]

    题目来源:洛谷 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球 ...

  5. P1197 [JSOI2008]星球大战 并查集 反向

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...

  6. 洛谷 P1197 [JSOI2008]星球大战——并查集

    先上一波题目 https://www.luogu.org/problem/P1197 很明显删除的操作并不好处理 那么我们可以考虑把删边变成加边 只需要一波时间倒流就可以解决拉 储存删边顺序倒过来加边 ...

  7. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  8. BZOJ5188: [Usaco2018 Jan]MooTube 并查集+离线处理

    BZOJ又不给题面... Luogu的翻译看不下去... 题意简述 有一个$n$个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你$Q$个询问,问你与点$v$的距离超过$k ...

  9. poj 2528 Mayor's posters 线段树 || 并查集 离线处理

    题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ...

随机推荐

  1. 【C#】 引用类型

    [C#] 引用类型 附图和代码为了便于理解引用类型 public static void RefDemo() { RefClass r1 = new RefClass { Name = "r ...

  2. 【紫书】(UVa1347)Tour

    继续考虑dp题目. 题意分析 其实这里只是更加仔细的做一个lrj的复读机(Orz 他分析了一个很重要的结果:如果是一个人从左到右再回来,并且每个点恰经过一次,那么等价于两个人从左到右每个点经过一次地遍 ...

  3. C++学习002-C++代码中插入汇编语句

    在C++中我们有时会遇到使用汇编语言的情况,这时可以在前面加上关键字“_asm”宏. 如下示例 编写环境 :vs2015 int main() { __asm mov al, 0x20; __asm ...

  4. python3.6 新特性学习

    #支持类型提示 typing { def greeting(name: str) -> str: return 'Hello ' + name #在函数greeting中,参数名称的类型为str ...

  5. 学习bash——通配符与特殊符号

    一.通配符 这是bash操作环境中一个非常有用的功能,这让我们使用bash处理数据就更方便了. 常用通配符如下: 符号 意义 * 代表0个到无穷多个任意字符 ? 代表一个任意字符 [] 代表一定有一个 ...

  6. NHibernate3.3.3 学习笔记1

    前言 昨天在园友的介绍下,我找了一本学习NHibernate的书:<NHibernate 3 Beginner’s Guide>. 第一章我直接跳过了,因为是英文版的看起来很吃力,且第一章 ...

  7. HDU 1445 Ride to School

    http://acm.hdu.edu.cn/showproblem.php?pid=1445 Problem Description Many graduate students of Peking ...

  8. DataView RowFilter Syntax [C#]

    RowFilter语法 private void btnEnquiry_Click(object sender, EventArgs e) { string filterExpression = st ...

  9. tomcat 服务添加到系统服务

    tomcat: 设置环境变量: CATALINA_HOME: tomcat路径 列如:D:\apache-tomcat-8.5.24 打开命令窗口,进入到tomcat/bin目录下 执行service ...

  10. [剑指Offer] 12.数值的整数次方

    [思路1]递归 class Solution { public: double Power(double base, int exponent) { ){ /base; exponent = -exp ...