#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
const int N = 5e3 + 10;
int n,k;
struct node{
int l,r;
bool operator < (const node &p)const{
if(l == p.l) return r > p.r;
return l < p.l;
}
}a[N],b[N];
int seg[N];
int dp[N][N]; //前i个数用了j个片段
int q[N][N],tail[N],head[N];
int main(){
cin >> n >> k;
for(int i = 1; i <= n; i++){
cin >> a[i].l >> a[i].r;
}
sort(a + 1,a + n + 1);
int cnt = 0,tot = 1;
int maxr = 0x3f3f3f3f;
for(int i = n; i >= 1; i--){
if(maxr <= a[i].r){
seg[++tot] = a[i].r - a[i].l;
}else{
//cout << a[i].l << " " <<a[i].r <<endl;
b[++cnt] = a[i];
maxr = a[i].r;
}
}
memset(dp,-0x3f,sizeof dp);
sort(b + 1,b + cnt + 1);
sort(seg + 1,seg + tot + 1,greater<int>());
//1 3 4 6
dp[0][0] = 0;
for(int i = 1; i <= k; i++) tail[i] = -1;
for(int i = 1; i <= cnt; i++){
//for(int j = 0; j <= i - 1; j++){
for(int l = k; l >= 1; l--){
while(dp[q[l][tail[l]] - 1][l - 1] + b[q[l][tail[l]]].r < dp[i - 1][l - 1] + b[i].r && tail[l] >= head[l]) --tail[l];
q[l][++tail[l]] = i;
/*if(b[i].l < b[j + 1].r){
dp[i][l] = max(dp[i][l],dp[j][l - 1] + b[j + 1].r - b[i].l);
}*/
while(b[q[l][head[l]]].r <= b[i].l && head[l] <= tail[l]){
++head[l];
}
//cout << i << " " << l << " " << q[l][head[l]] << endl;
dp[i][l] = max(dp[i][l],dp[q[l][head[l]] - 1][l - 1] + b[q[l][head[l]]].r - b[i].l);
}
//}
}
int sum = 0;
int maxn = dp[cnt][k];
for(int i = 1; i <= tot && i <= k; i++){
sum += seg[i];
maxn = max(maxn,sum + dp[cnt][k - i]);
}
if(maxn > 0)
cout << maxn << endl;
else cout << 0 << endl;
return 0;
}
牛客多校2 G League of Legends
最新推荐文章于 2025-03-27 16:30:45 发布