3453.【NOIP2013中秋节模拟】连通块(connect)

Time Limits: 1000 ms Memory Limits: 262144 KB

(File IO): input:connect.in output:connect.out

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<=10

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

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

题解

连通块问题,典型的并查集,要加预处理

用l[i][j]记录前i条边构成的集合

用r[i][j]记录后i条边构成的集合

询问x到y被破坏时,只需要将l[x-1]和r[y+1]合并,求连通块即可

代码

#include<cstdio>
#include<cstring>
#define N 510
#define M 10010 long l[M][N],r[M][N],c[N];
long x[M],y[M],n;
bool b[N]; long cha(long x,long father[])
{
if(father[x]==x)return x;
else return father[x]=cha(father[x],father);
}
void bin(long x,long y,long father[])
{ long fx,fy;
fx=cha(x,father);
fy=cha(y,father);
if(fx!=fy)father[fx]=fy;
}
long suan(long xx,long yy)
{ long i,ans;
memcpy(c,l[xx-1],sizeof(l[xx-1]));
for(i=1;i<=n;i++)
if(r[yy+1][i]!=i)
bin(c[i],r[yy+1][i],c);
memset(b,false,sizeof(b));
ans=0;
for(i=1;i<=n;i++)
if(!b[cha(i,c)]){
b[cha(i,c)]=true;
ans++;
}
return ans;
} int main()
{ long m,i,k,xx,yy;
freopen("connect.in","r",stdin);
freopen("connect.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(i=1;i<=m;i++)
scanf("%ld%ld",&x[i],&y[i]);
for(i=1;i<=n;i++)
l[0][i]=r[m+1][i]=i;
for(i=1;i<=m;i++){
memcpy(l[i],l[i-1],sizeof(l[i-1]));
bin(x[i],y[i],l[i]);
}
for(i=m;i>=1;i--){
memcpy(r[i],r[i+1],sizeof(r[i+1]));
bin(x[i],y[i],r[i]);
}
scanf("%ld",&k);
for(i=1;i<=k;i++){
scanf("%ld%ld",&xx,&yy);
printf("%ld\n",suan(xx,yy));
}
return 0;
}

JZOJ 3453.【NOIP2013中秋节模拟】连通块(connect)的更多相关文章

  1. JZOJ【NOIP2013模拟联考14】隐藏指令

    JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...

  2. DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)

    题目链接 #1381 : Little Y's Tree 时间限制:24000ms 单点时限:4000ms 内存限制:512MB 描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每 ...

  3. UVA 572 油田连通块-并查集解决

    题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...

  4. HD1269迷宫城堡(有向图 && 划分连通块)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. DFS(连通块) ZOJ 2743 Bubble Shooter

    题目传送门 题意:从炮台射出一个球,三个及以上颜色相同的会掉落,问最后会掉落多少个球 分析:先从炮台找一个连通块,然后与顶部连接的连通块都不会掉落,剩下的就是炮台射出后跟随掉落的. #include ...

  6. Codeforces Round #375 (Div. 2)——D. Lakes in Berland(DFS连通块)

    D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  8. UVa 572 油田(DFS求连通块)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. DFS入门之二---DFS求连通块

    用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所 ...

随机推荐

  1. day09-正侧表达式

    while True: phone_num = input('please input your phone_num:') if len(phone_num) == 11 \ and phone_nu ...

  2. BBuBBBlesort!

    题目描述 Snuke got an integer sequence of length N from his mother, as a birthday present. The i-th (1≦i ...

  3. SQLserver安装了多个实例,实例端口号也被修改后的代码连接方式

    事例说明 IP地址为192.168.1.100的服务器上安装了SQLServer2000,它有两个实例,分别为:默认实例——JLW和另外新建的实例——JLW\TEST SQLServer网络实用工具中 ...

  4. springboot学习笔记:5.spring mvc(含FreeMarker+layui整合)

    Spring Web MVC框架(通常简称为"Spring MVC")是一个富"模型,视图,控制器"的web框架. Spring MVC允许你创建特定的@Con ...

  5. deeplearning.ai 序列模型 Week 2 NLP & Word Embeddings

    1. Word representation One-hot representation的缺点:把每个单词独立对待,导致对相关词的泛化能力不强.比如训练出“I want a glass of ora ...

  6. 响应式WEB页面开发实践

    转自:https://github.com/markyun/My-blog/issues/27 最近得到一个新任务单,让我用一套页面适应所有主流终端(Android.iPhone.iPad.PC),而 ...

  7. Markdown快速使用指南

    Markdown 是一种轻量级的标记语言,他简洁.高效,目前被越来越多的写作爱好者,撰稿者广泛使用.Markdown的语法十分简单.常用的标记符号也不超过十个,这种相对于更为复杂的 HTML 标记语言 ...

  8. 吴裕雄--天生自然HTML学习笔记:HTML 简介

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. mac命令日常总结

    查看某个端口被占用 lsof -i tcp:8080 kill进程: 找到进程的PID,使用kill命令:kill -9 716(PID) date 显示系统日期 mkdir xx 创建xx目录 rm ...

  10. JavaScript 中事件对象参数:clientX、clientY、offsetX、offsetY、screenX、screenY

    JavaScript 中一些概念理解 :clientX.clientY.offsetX.offsetY.screenX.screenY clientX 设置或获取鼠标指针位置相对于窗口客户区域的 x ...