仙人掌[cactus]

題面

目測圖論
結果是區間覆蓋
(╯‵□′)╯︵┻━┻
尊重一下你的名字好嗎

因爲美妙的仙人掌的性質
我們可以知道對於任意一個點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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章