【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. ...
随机推荐
- 【BZOJ1396】识别子串 - 后缀自动机+线段树
题意: Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. 题解: ...
- 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务
作者: Yi Ming Huang, 软件工程师, IBM Dong Fei Wu, 软件工程师, IBM Qing Guo, 软件工程师, IBM 出处: http://www.ibm.com/de ...
- C#RichTextBox复制并跳转指定行
方法一: rTxt.Focus(); //设置文本框中选定的文本起始点 为 指定行数第一个字符的索引 rTxt.SelectionStart = rTxt.GetFirstCharIndexFromL ...
- Python数学实现二元一次方程
import cmath import math import sys def get_float(msg,allow_zero): x = None while x is None: try: x ...
- mysql创建数据库并指定uft8编码
CREATE DATABASE IF NOT EXISTS ymk default character set utf8 COLLATE utf8_general_ci;
- AT1145 ホリドッグ
洛谷的题解区里竟然没有O(1)做法详解-- 题面就是要判断\(1+2+\dots+n\)是不是素数 很容易让人想到上面的式子事实上等于\(n(n+1)/2\) 根据质数的定义,质数只能被1和自身整除 ...
- Java并发和多线程4:使用通用同步工具CountDownLatch实现线程等待
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown ...
- VUE:渐进式JavaScript框架(小白自学)
VUE:渐进式JavaScript框架 一.官网 英文 https://vuejs.org/ 中文 https://cn.vuejs.org/ 二:渐进式 即有一个核心库,在需要的时候再逐渐添加插件的 ...
- 自己定义控件-MultipleTextView(自己主动换行、自己主动补齐宽度的排列多个TextView)
一.功能: 1.传入一个 List<String> 数组,控件会自己主动加入TextView,一行显示不下会自己主动换行.而且把上一行末尾的空白通过拉伸而铺满. 2.配置灵活 <co ...
- 确保 Xcode 每次 Build 时都自己主动更新资源
參考:p=22" target="_blank">http://quick.cocoachina.com/?p=22 刚建立的quickproject.每次修改lu ...