目测图论
结果是区间覆盖
(╯‵□′)╯︵┻━┻
尊重一下你的名字好吗
因为美妙的仙人掌的性质
我们可以知道对于任意一个点i
i和i+1一定直接相连
这样就产生了一条链
根据美妙的仙人掌的性质
接下来再选两条边u1v1和u2v2的时候
[u1,v1]和[u2,v2]不能有重叠部分
tip:但是可以共用一个点
这样就变成了选不重叠的区间使区间数量最大
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<ctime>
#define MOD 1000000007
#define LL long long
using namespace std;
struct nico
{
int l,r;
}lin[4000005];
int n,m,i,u,v,tot,p,ans;
bool comp(nico a,nico b)
{
return a.r<b.r;
}
int main()
{
freopen("cactus.in","r",stdin);
freopen("cactus.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
if(u>v) swap(u,v);
if(u!=v-1)
{
tot++;
lin[tot].l=u;
lin[tot].r=v;
}
}
sort(lin+1,lin+tot+1,comp);
for(i=1;i<=tot;i++)
if(lin[i].l>=p)
{
p=lin[i].r;
ans++;
}
printf("%d",ans+n-1);
return 0;
}