原题

Description

你应该知道无向图的连通块的数量,你应该知道如何求连通块的数量。当你兴奋与你的成就时,破坏王Alice拆掉了图中的边。当她发现,每删去一条边,你都会记下边的编号,同时告诉她当前连通块的个数。

然而,对边编号简直就是个悲剧,因为Alice为了刁难你,拆掉编号从l到r的边,当然你需要做的事情就是求连通块的个数。如果你答对了,Alice会把拆掉的边装好,迚行下一次破坏。如果你无法完成这个任务,Alice会彻底毁了你的图。

进行完足够多次之后,Alice觉得无聊,就玩去了,而你却需要继续做第三题。

Input

第一行两个整数n,m,表示点数和边数。

之后m行每行两个整数x,y,表示x与y之间有无向边。(按读入顺序给边编号,编号从1开始)

一行一个整数k,表示Alice的破坏次数。

之后k行,每行两个整数l,r。

Output

k行,每行一个整数。

Sample Input

6 5

1 2

5 4

2 3

3 1

3 6

6

1 3

2 5

1 5

5 5

2 4

3 3

Sample Output

4

5

6

3

4

2

Data Constraint

对于30%的数据,n<=100,k<=10n

对于60%的数据,k<=1000k

对于100%的数据,n<=500,m<=10000,k<=20000,1<=l<=r<=mn

题解

  • 并查集。Collect!

  • 每一个 f[i]f[i] 为一个并查集,记录只添加前 ii 条边时,所有节点的联通情况。

  • 每一个 g[i]g[i] 也是一个并查集,记录只添加 i—mi—m 条边时,所有节点的联通情况。

  • 对于每个询问只要把 f[l−1]f[l-1] 和 g[r+1]g[r+1] 合并至 H[]H[ ] 中。

  • 最后在 H[]H[] 中判断即可。

Code

#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
struct data
{int x,y;
}a[10002];
int f[10002][501],g[10002][501],h[501];
inline int read()
{int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data;
}//读入优化
inline int getf(int k,int x)
{if(f[k][x]==x) return x;return f[k][x]=getf(k,f[k][x]);
}//F的查找
inline int getg(int k,int x)
{if(g[k][x]==x) return x;return g[k][x]=getg(k,g[k][x]);
}//G的查找
void init()
{n=read();m=read();for(int i=1;i<=m;i++) a[i].x=read(),a[i].y=read();for(int i=1;i<=n;i++) f[0][i]=g[m+1][i]=i;//初值for(int i=1;i<=m;i++){memcpy(f[i],f[i-1],sizeof(f[i]));f[i][getf(i,a[i].x)]=getf(i,a[i].y);}//F的处理for(int i=m;i;i--){memcpy(g[i],g[i+1],sizeof(g[i]));g[i][getg(i,a[i].x)]=getg(i,a[i].y);}//G的处理
}
inline int geth(int x)
{if(h[x]==x) return x;return h[x]=geth(h[x]);
}//H的查找
void work()
{int k=read();while(k--){int l=read()-1,r=read()+1;memcpy(h,f[l],sizeof(h));for(int i=1;i<=n;i++) h[geth(h[i])]=geth(g[r][i]);//H的处理int ans=0;for(int i=1;i<=n;i++)if(h[i]==i) ans++;//H的判断printf("%d\n",ans);}
}
int main()
{freopen("connect.in","r",stdin);freopen("connect.out","w",stdout);init();work();return 0;
}

JZOJ 3453【NOIP2013中秋节模拟】连通块相关推荐

  1. HDU - 1547 Bubble Shooter(dfs+连通块+模拟)

    题目链接:点击查看 题目大意:模拟泡泡枪游戏,问当击破指定位置的泡泡时,能有多少个泡泡同时爆炸? 题目分析:一个中规中矩的连通块问题,只不过在向四周扩散的时候需要注意的是,奇数行和偶数行的方向有点不一 ...

  2. 【2018.5.12】模拟赛之三-ssl2415 连通块【并查集】

    正题 题目大意 在一个n*n的棋盘上进行m此操作.在一个格子上放一个黑或白的棋子.多个相连的同色棋子形成一个连通块,求每次操作后求连通块数. 解题思路 并查集表示连通,然后每次扩展,如果有同色的就连通 ...

  3. 1021 Deepest Root (25 分) 【难度: 中 / 知识点: 树的直径 连通块】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805482919673856 方法一: 数组模拟邻接表 第一步: 爆搜df ...

  4. [C] [编程题]连通块(DFS解决)

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 256M,其他语言512M 来源:牛客网 金山办公2020校招服务端开发工程师笔试题(一) 题目描述 给一个01矩阵,1代表是陆地,0代表 ...

  5. [C] 深度优先搜索解决连通块/染色问题——求岛的个数

    本文介绍用DFS解决连通块个数问题 有关dfs的介绍见另外一篇:不撞南墙不回头--深度优先搜索 例题 宝岛探险 题目描述 一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示 ...

  6. C. Edgy Trees Codeforces Round #548 (Div. 2) 【连通块】

    一.题面 here 二.分析 这题刚开始没读懂题意,后来明白了,原来就是一个数连通块里点数的问题.首先在建图的时候,只考虑红色路径上的点.为什么呢,因为为了不走红色的快,那么我们可以反着想只走红色的路 ...

  7. 树形dp ---- gym101655 D - Delta Quadrant 树上连通块思维换根 + 树形dp

    题目链接 题目大意: 给你一颗NNN个节点的树,树上每条边有边权就是遍历的时间,你可以从任意节点出发遍历N−kN-kN−k个点并且回到出发点,问你最短的时间是多少? k∈[0,min(N,20)],N ...

  8. UVa572 Oil Deposits DFS求连通块

    技巧:遍历8个方向 for(int dr = -1; dr <= 1; dr++)for(int dc = -1; dc <= 1; dc++)if(dr != 0 || dc != 0) ...

  9. oracle asm dd命令,ASM来用DD命令模拟数据块损坏

    ASM来用DD命令模拟坏块 会话1:oracle SQL> create tablespace test datafile '+DATA/ora11g23/datafile/test.dbf' ...

最新文章

  1. linux系统运维费用,一般Linux运维学习的费用是多少?Linux学习
  2. JAVA基础中容易踩坑的知识点
  3. OpenGL水波纹效果
  4. Numpy学习-数组的索引
  5. 关于Python异常处理,你需要了解的知识点
  6. 全球 IPv4 地址耗尽,IPv6 来了!
  7. Ti的DM368系列芯片的所有PDF资料汇总
  8. 童家旺:如何用分表存储来提高性能
  9. Easyui validatebox修改——1.当text发生变化时在校验,2.取消校验,3扩展自定义验证
  10. 我的测试生活感悟2 - Art Of Unit Testing
  11. 微信小程序本地存储存储_如何利用本地存储构建快速的应用程序
  12. VB.NET工作笔记008---vs2017创建使用WCF服务_并调用服务demo
  13. C# 笔记1 - 操作目录
  14. word中脚注和尾注的处理
  15. Beautiful Soup的安装
  16. Unity - RectTransform详解
  17. 开始做一个简单的记账工具
  18. CPA二十一--划出和追加保证金(转载)
  19. python回调廖雪蜂_Python 廖雪峰教程《三》
  20. Python 字典:当索引不好用时

热门文章

  1. 手把手实现YOLOv3(一)
  2. Python进阶_wxpy学习:用微信监控你的程序
  3. Win10:tensorflow学习笔记(4)
  4. IP地址,子网掩码、默认网关,DNS服务器是什么意思
  5. STL vector的几种清空容器(删除)办法
  6. java汽车租赁系统_汽车租赁公司全网低价
  7. 科大星云诗社动态20220115
  8. ModuleNotFoundError: No module named 'mpl_toolkits.basemap'
  9. java map 查找_Map 查找表操作
  10. 移动语义-右值引用-完美转发-万字长文让你一探究竟