【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. ...
随机推荐
- sed将上下两行并列
#cat log5 mmmm 1234 nnnn 2344 #sed -n '{N;s/\n/\t/p}' log5 mmmm 1234 nnnn 2344
- 汇编(assembling)简介(源:阮一峰)
简介 计算机真正能够理解的是低级语言,它专门用来控制硬件.汇编语言就是低级语言,直接描述/控制 CPU 的运行.如果你想了解 CPU 到底干了些什么,以及代码的运行步骤,就一定要学习汇编语言. 我们知 ...
- NOIP2018提高组金牌训练营——字符串专题
NOIP2018提高组金牌训练营——字符串专题 1154 回文串划分 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. a|bb|aabaa - 3 个 ...
- Hash大法
内容参考<算法竞赛进阶指南> 之前集训的时候听老师讲过,字符串题目中,hash一般不是正解,但是是一个优秀的暴力,可以拿比较多的部分分. hash涉及内容很多,这里只讨论字符串hash 可 ...
- 利用Python对文件进行批量重命名
最近几天工作的内容是对40个项目进行考核,每个项目都需要一个考核评分表,已经有了项目的列表. 如果用常规的方法,需要复制40个文件,并逐个修改,不光工作量大,也容易出错,后期修改也不方便. 于是想到了 ...
- Docker 管理工具的选择:Kubernetes 还是 Swarm?
[编者的话]选择Kubernetes 或者 Swarm 就像在将 Linux 桌面发行版的范围缩小到两个后选出一个最喜欢的.哪个更满足你的需要如何才是决定因素. [3 天烧脑式基于Docker的CI/ ...
- .C#-NET开源方向基本
我的理解,nancyFx是一个.net的微型框架,可以在Linux环境下运行,ServiceStack也是全平台框架,更大一些 owin的概念:Open Web Server Interface Fo ...
- 洛谷 P3133 [USACO16JAN]无线电联系Radio Contact
P3133 [USACO16JAN]无线电联系Radio Contact 题目描述 Farmer John has lost his favorite cow bell, and Bessie the ...
- Scratch单机版下载
Scratch单机版下载 这两个地址速度比较快: Adobe Air:http://7dx.pc6.com/wwb5/AdobeAIR2800127.zip Scratch :http://7dx.p ...
- 【iOS】UICollectionView自己定义Layout之蜂窝布局
网上的UICollectionView的Layout布局,其cell的形状多为矩形和圆形. 本篇博文将正六边形作为cell的基本形状,为您展现独特的蜂窝布局效果及实现源代码. 帮助您让自己的App脱颖 ...