正题
题目链接:https://jzoj.net/senior/#main/show/3845
题目大意
美丽的仙人掌定义为:
一个仙人掌,第iii到jjj号点(i<j)(i<j)(i<j)一定存在一条经过了j−i+1j-i+1j−i+1个点的简单路径。
给出一张无向图,选出最多的边使得它是一个美丽的仙人掌。
解题思路
首先这张图的基础是一条链贯穿1∼n1\sim n1∼n,然后我们在上面加边,我们发现若i∼ji\sim ji∼j之间加了边,那么他们之间就不能再加边了,问题转换为给出若干条线段,选择出最多的使它们互不重叠。
fif_ifi表示到第iii个时的最多线段,那么有fi=max{fi−1,fj+1(j−>i)}f_i=max\{f_{i-1},f_j+1(j->i)\}fi=max{fi−1,fj+1(j−>i)}
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+10;
int n,m,f[N],ans;
bool v[N];
vector<int> q[N];
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);if(x>y) swap(x,y);if(x==y-1&&!v[y]) ans++,v[y]=1;else q[y].push_back(x);}for(int i=1;i<=n;i++){f[i]=f[i-1];for(int j=0;j<q[i].size();j++)f[i]=max(f[i],f[q[i][j]]+1);}printf("%d",f[n]+ans);
}