题意

https://vjudge.net/problem/CodeForces-1253D

一个无向图,对于任意l,r,如果l到r有路径,那么l到m也有路径(l<m<r),问最少加多少条边,使得上述条件成立。

思路

先用并查集缩成若干个连通块,顺带把每个连通块的最大值求出来,然后我们从1到n开始遍历每个点,记录当前点所在连通块的最大值,然后如果i小于最大值而且和i-1不在一个连通块内,就合并这两个连通块。计算需要合并的次数即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int pre[N],mx[N];
int find(int x)
{
if(x==pre[x])
return x;
return pre[x]=find(pre[x]);
}
int main()
{
std::ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
map<int,int> mp;
for(int i=1;i<=n;i++)
pre[i]=mx[i]=i;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
int fu=find(u),fv=find(v);
if(fu!=fv)
pre[fv]=fu,mx[fu]=max(mx[fu],mx[fv]);
}
int mxx=0,ans=0;
for(int i=1;i<=n;i++)
{
int f=find(i);
if(i<=mxx&&find(i)!=find(i-1))
{
pre[find(i-1)]=find(i);
ans++;
}
mxx=max(mxx,mx[find(i)]);
}
cout<<ans<<endl;
return 0;
}

  

  

最新文章

  1. 使用Jquery的Ajax实现无刷新更新,修改,删除页面
  2. 2016 Multi-University Training Contest 4
  3. 安卓解析json,使用BaseAdapter添加至ListView中,中间存储用JavaBean来实现
  4. OSChina码云试用
  5. bootstrap垂直下拉菜单默认展开
  6. Makecert.exe(证书创建工具)
  7. Java学习笔记(十九)——Java 日志记录 AND log4j
  8. 遇到 Error creating the Web Proxy specified in the &#39;system.net/defaultProxy&#39; configuration section的解决办法
  9. serv-u设置被动模式注意的问题
  10. 1033. Labyrinth(dfs)
  11. jenkins 命令行 CLI jenkins-cli.jar
  12. bzoj 3637: Query on a tree VI 树链剖分 &amp;&amp; AC600
  13. 快速理解webStroage
  14. 02.零成本实现WEB性能测试-基于APACHE JMETER
  15. AspNet.OData 协议概述
  16. node.js面向对象实现(二)继承
  17. 在react/redux中使用Immutable
  18. CentOS下安装Vmtools
  19. flask 在模板中渲染表单
  20. nginx www解析失败问题解决

热门文章

  1. Redis—配置文件详解
  2. PyCharm将选中的内容加上引号
  3. Octave-CostFunction
  4. 9. Vue - vue-cli
  5. Re-py交易
  6. web系统测试策略
  7. 【python爬虫】requests模块
  8. Python程序中的进程操作-进程间数据共享(multiprocess.Manager)
  9. 【JS】JS数组添加元素的三种方法
  10. Mybatis关联查询之一