【Henu ACM Round#24 E】Connected Components
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
要求把连续的一段li..ri的边全都删掉。
然后求剩下的图的联通数
如果暴力的话
复杂度显然是O(k*m)级别的。
考虑我们把li..ri全都删掉。
接下来要做两件事。
第一是把1..li-1这些边连起来。
并查集1
然后是把ri+1..m这些边连起来。
并查集2
然后把并查集1和并查集2合并在一起求联通分量就好
两个并查集合在一起可以在线性复杂度内完成。
那么花费的时间就在1..li-1和ri+1,,m这两个并查集的获取上。
注意到n非常小。
我们可以处理出来前i条边的前缀并查集。
和i..m这些边的后缀并查集。
这样这两个并查集就能在O(1)下获取了。
然后合并两个并查集就好。
复杂度是O(n*m)
足以通过了。
【代码】
#include <bits/stdc++.h>
using namespace std;
const int M = 1e4;
const int N = 500;
struct BCJ{
int f[N+10],n;
void Init(int nn){
n = nn;
for (int i = 1;i <= n;i++) f[i] = i;
}
int ff(int x){
if (f[x]==x) return x;
else return f[x] = ff(f[x]);
}
void join(int x,int y){
int r1 = ff(x),r2 = ff(y);
if (r1!=r2) f[r1] = r2;
}
int Get_Union(){
int cnt = 0;
for (int i = 1;i <= n;i++)
if (ff(i)==i){
cnt++;
}
return cnt;
}
}pre[M+10],last[M+10];
pair<int,int> a[M+10];
int n,m;
int solve(BCJ a,BCJ b){
for (int i = 1;i <= n;i++) b.join(a.ff(i),i);
return b.Get_Union();
}
int main()
{
cin >> n >> m;
for (int i = 1;i <= m;i++) cin >> a[i].first >> a[i].second;
pre[0].Init(n);
for (int i = 1;i <= m;i++){
pre[i] = pre[i-1];
pre[i].join(a[i].first,a[i].second);
}
last[m+1].Init(n);
for (int i = m;i >= 1;i--){
last[i] = last[i+1];
last[i].join(a[i].first,a[i].second);
}
int k;
cin >> k;
for (int i = 1;i <= k;i++){
int x,y;
cin >> x >> y;
cout<<solve(pre[x-1],last[y+1])<<endl;
}
return 0;
}
【Henu ACM Round#24 E】Connected Components的更多相关文章
- 【Henu ACM Round#24 D】Iterated Linear Function
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把B提取出来就是一个等比数列了. 求和一下会发现是这种形式. \(B*\frac{(A^n-1)}{A-1}+A^n*x\) 则求一 ...
- 【Henu ACM Round#24 C】Quiz
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 肯定是这样 先放k-1个,然后空1个,然后再放k-1个.然后再空1个.. 以此类推. 然后如果(n/k)*(k-1)+n%k> ...
- 【Henu ACM Round#24 B】Gargari and Bishops
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果写过n皇后问题. 肯定都知道 某个点(i,j)和它在同一条对角线上的点分别是i+j的值和i-j的值相同的点. 然后会发现选择的两 ...
- 【Henu ACM Round#24 A】k-String
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果是一个k-string的话. 考虑最后的串假设形式为sss..ss(k个s) 则s中出现的字母,整个串中最后出现的次数肯定为k的 ...
- 【Henu ACM Round#15 F】Arthur and Questions
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3 ...
- 【Henu ACM Round#16 F】Om Nom and Necklace
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] KMP算法可以把"i前缀"pre[i] 分成ssssst的形式 这里t是s的前缀. 然后s其实就是pre[i]中 ...
- 【Henu ACM Round#16 E】Paths and Trees
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 感觉很像一道最短路. 然后就试了一发. 结果真的是.. 只要用一个优先队列优化的dijkstra算法求出每个点的最短路上的前一个点是 ...
- 【Henu ACM Round#18 F】Arthur and Walls
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其 ...
- 【Henu ACM Round#17 F】Upgrading Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1. ...
随机推荐
- UVA1584-Circular Sequence(紫书例题3.6)
Some DNA sequences exist in circular forms as in the following gure, which shows a circular sequence ...
- 变量命名规范及str类型
变量命名规范: 1.单词之间用_分开 add_num() 2.全局变量,大写 PI,NUMBER() 3.实例变量,以_开头 _example() 4.私有实例变量 __private() 5.普通函 ...
- bat启动.exe的应用程序
新建一个文本文档,编写如下,完成后保存将后缀名txt改为bat即可. rem 启动***(要启动的服务名) @echo off rem 程序安装的顶层目录 d: rem 设置显示文字颜色 color ...
- ASP.NET-GUID扩展类使用
在NUGET上有一个GUID的类,安装试用一下它的方法 将string转为guid对象 Guid ad = new Guid("{99009327-15D2-4A69-B015-BEAC11 ...
- POJ——T1125 Stockbroker Grapevine
http://poj.org/problem?id=1125 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36045 ...
- 【源代码】将一个整数的每位数分解并按逆序放入一个数组中(用递归算法)(C语言实现)
帮朋友做的,好像是一个面试题.假设不过考察递归的话.应该是够了,程序的健壮性和通用性都非常一般的说-- #include <stdio.h> #include <stdlib.h&g ...
- Oracle 后台进程介绍
一 进程分类: 1.服务器进程(server process): 依据客户请求完毕工作.如接收和处理应用发送的SQL语句 2.后台进程(background process): 随数据库而启动,用于完 ...
- crm操作报价单实体
using System; using Microsoft.Xrm.Sdk; using Microsoft.Crm.Sdk.Messages; using Microsoft ...
- nyoj--1023--还是回文(动态规划)
还是回文 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母) ...
- ORACLE 11GR2 RAC的网络规划解析
在ORACLE 11gR2中,安装RAC发生了显著变化.在10g以及11gR1的时代,安装RAC的步骤是先安装CRS,再安装DB,而到了11gR2的时代,crs与asm被集成在一起,合称为GRID,必 ...