codeforces1399F Yet Another Segments Subset

https://codeforces.com/contest/1399/problem/F

就我们只要考虑怎么嵌套就行了,求出f[i]为第i个区间内部加本身能放下满足要求的区间总数,最后增加一个mini-max的区间,就把整个问题转换成了这整个嵌套最多能多少。

肯定是把长度小的套进长度大的,所以我们先把所有区间按长度排个序

然后把被当前要计算f[i]的区间包含的所有区间拿出来对右端点排序,也可以直接丢进右端点下标的vector里面

然后从左到右扫这个区间,最多可以放多少个不相交的区间,但区间的值要改成这个区间本身加上套在他里面的区间总数f[j],因为这个子区间更短,所以f[j]已知了。剩下的就是个经典线性dp

#include
#define pb push_back
using namespace std;
typedef long long ll;

const int maxl=3e5+10;

int n,m,cas,k,cnt,tot,ans;
struct node
{
	int l,r,len,id;
}a[maxl];
vector b[maxl];
int num[maxl],f[maxl],dp[maxl]; 
char s[maxl];
bool in[maxl]; 

inline bool cmplen(const node &a,const node &b)
{
	return a.len

 

你可能感兴趣的:(DP)