Description

dzy 手上有一张n 个点m 条边的联通无向图,仙人掌是一张每条边最多在一个简单环内的联通无向图。他想求这个无向图的生成仙人掌中最多有多少条边。

但是dzy 觉得这个问题太简单了,于是他定义了“美丽的生成仙人掌”,即在一个生成仙人掌中如果满足对于任意编号为i,j (i < j) 的两点,存在一条它们之间的简单路径上面有j-i+1 个点,则这个仙人掌是美丽的。

他现在想要知道这张图的美丽的生成仙人掌中最多有多少条边,你能帮帮他吗?

Input

第一行两个整数n,m。接下来m 行每行两个整数ui,vi,表示这两个点之间有一条无向边。保证图中没有自环。

Output

仅一行一个整数表示答案。

Sample Input

2 1

1 2

Sample Output

1

Hint

对于10% 的数据,n <=10。

对于30% 的数据,n <=10^3。

对于100% 的数据,n <=10^5,m <= 2n。

时间限制:1S

空间限制:256M


题解

这是道好题。最开始拿到题,第一反应这是道图论题。但是想了很久都想不出来该怎么搞。

根据题意,因为数据保证有解,所以在图中必定存在一条从1 -> 2 -> ... -> n的链,最后的答案呢肯定是以此为基础的。

我们把 1 到 n 的这条链看作是一条线段。再加边看作是用一条新的线段来覆盖。根据仙人掌图的定义,任何一条边不能同时存在于两个不同的环中。意思就是在新加的这些线段中不能有任何两条线段覆盖同一个区域。求最多的边就是求最多的线段。这不就是一个简单的线段覆盖问题么? 把所有边按右端点排序,一个贪心就好了。

代码

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = 1e5 + 5;
int n,m;
int vis[maxn]; struct edge {
int l,r;
bool operator < (const edge &a) const {
return r < a.r;
}
}e[maxn << 1]; int main() {
scanf("%d%d",&n,&m);
for(int i = 0;i < m;i++) {
int x,y;scanf("%d%d",&x,&y);if(x > y)swap(x,y);
e[i] = (edge){x,y};
}
sort(e,e+m);
int x = 1;
int ans = n - 1;
for(int i = 0;i < m;i++) {
if(e[i].r == e[i].l+1&&!vis[e[i].l]) {vis[e[i].l] = 1;continue;}
if(e[i].l < x)continue;
x = e[i].r;ans++;
} printf("%d",ans);
return 0;
}

[10.27_P3] 简单题 (脑洞)的更多相关文章

  1. [BZOJ2683][BZOJ4066]简单题

    [BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...

  2. 又一道简单题&&Ladygod(两道思维水题)

    Ladygod Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  3. BZOJ 3687: 简单题 bitset

    3687: 简单题 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 小呆开始研究集合论了,他 ...

  4. Loj 【CQOI 2006】简单题,mmp

    #10117. 「一本通 4.1 练习 2」简单题     题目描述 题目来源:CQOI 2006 有一个 nnn 个元素的数组,每个元素初始均为 000.有 mmm 条指令,要么让其中一段连续序列数 ...

  5. 洛谷 P4148 简单题 解题报告

    P4148 简单题 题意 维护单点加与矩形求和,强制在线 说明 \(n\le 500000,m\le 200000\),\(4000ms / 20MB\) kd-tree 复杂度我不懂 是一颗平衡树, ...

  6. HDU 6106 17多校6 Classes(容斥简单题)

    Problem Description The school set up three elective courses, assuming that these courses are A, B, ...

  7. 简单题(K-D Tree)

    简单题不简单-- 我们把单点加操作改成插入一个权值为增加量的点,将问题转化成询问一个矩阵中所有点的和,用 \(K-D\ Tree\) 维护,时间复杂度 \(O(n\sqrt{n})\) \(Code\ ...

  8. 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治

    [BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...

  9. acm.njupt 1001-1026 简单题

    点击可展开上面目录 Acm.njupt 1001-1026简单题 第一页许多是简单题,每题拿出来说说,没有必要,也说不了什么. 直接贴上AC的代码.初学者一题题做,看看别人的AC代码,寻找自己的问题. ...

随机推荐

  1. OI中的小智慧

    反正不会咕咕的. sort之类没+1的问题不说 双向边n*2的问题不说 变量n+5的问题不说 1.先生成后判断 (见NOIP 2016 pj t2回文日期) 这个思想在这道题体现的不明显,记得洛谷上面 ...

  2. cherrypy & gevent patch

    给cherrypy 打gevent WSGIServer的patch 1. patch Serving 类 2. 关闭python的原生WSGIServer 具体使用例子参考 我的开源项目  http ...

  3. 【转】亿级Web系统搭建——单机到分布式集群

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  4. linux centos7 swap 设置 添加 删除

    操作  需要  root 用户 权限 dd 命令 创建swap用的分区文件 /var/swap  dd if=/dev/zero of=/var/swap bs=1024 count=2048000 ...

  5. 在oracle下我们如何正确的执行数据库恢复

    标签:oracle 数据库 恢复 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://jiujian.blog.51cto.com/4 ...

  6. hdu 4091

    #include<stdio.h> #include<math.h> __int64 gcd(__int64 a,__int64 b) {  if(b==0)   return ...

  7. The Grove(poj 3182)

    题意:一个n*m(n,m<=50)的矩阵有一片连着的树林,Bessie要从起始位置出发绕林子一圈再回来,每次只能向横着.竖着或斜着走一步.问最少需多少步才能完成. /* 如果我们用搜索来写的话, ...

  8. CodeForces - 601A The Two Routes

    http://codeforces.com/problemset/problem/601/A 这道题没想过来, 有点脑筋急转弯的感觉了 本质上就是找最短路径 但是卡在不能重复走同一个点 ----> ...

  9. 【收藏】下载Chrome商店插件的方法,万恶的gwd

    以下是下载离线插件包的方法: 第一步: 每个Google Chrome扩展都有一个固定的ID,例如https://chrome.google.com/webstore/detail/bfbmjmiod ...

  10. hdu2294:Pendant

    T<=10组数据问K<=30种珠子每种n<=1e9串成1~n长度的序列共有多少种,mod1234567891. 方程没想到.矩阵不会推.很好. f[i][j]--长度i,j种珠子方案 ...