8.8爆0祭
T3: ... ...不会 选k个集合,每个集合的价值就是线段交集的长度,求最大总价值 不存在两个集合的价值都为空 因为我们可以把一个空集里面的线段只留下1条,其他的放在另一个空集里面 只有一个空集:把前k-1长的线段拿出来(取) 没有空集: 一个性质: 如果有一条线段包含另一条线段,则他们放在同一个集合里面,不对答案有影响 所以只考虑不被任何一条线段包含的线段 按照左端点排序,然后右端点也是递增的(因为只考虑哪些不包含别的线段的线段,如果右端点不递增,就说明里面有包含别的线段的线段) 然后就可以dp了??? 一个集合里的线段应该是连续的一段线段构成的 dp[i][j]:前i条线段分成j组的最大贡献(集合里的线段是连续的) dp[i][j]=max(dp[x][j-1]+r[x+1]-l[i])(r[x+1]>l[i]) 可以单调队列优化...... stdの神仙代码: #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> using namespace std; const int N=6006; typedef long long ll; const ll inf=5e13; int n,m,k,len_n,r;