题解:P11639 Line Game
chenly8128 · · 题解
最难的是看懂题目。
本质上就是给出
理解到这一步,直接使用整体减空白思想和贪心大法。
- 首先,计算不删除任何子线段情况下,点的总数。
- 接着,计算把每条线段中任意的相邻的两个关键点之间子线段删去,能够减少的点的个数。并存入一个数组
a 。 - 然后,
a 从大到小排序。 - 最后,从总点数中减掉
a 中大于0 的至多前m-1 项。
然后就好了,复杂度
CODE
// Author: chenly8128
// Created: 2025-01-30 15:58:36
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(void) {
int res = 0;bool flag = true;char c = getchar();
while (c < '0' || c > '9') {flag ^= (c == '-');c = getchar();}
while (c >= '0' && c <= '9') {res = (res << 3) + (res << 1) + (c ^ 48);c = getchar();}
return flag ? res : -res;
}
vector <int> res;
vector <int> v;
int n,m,a;
ll sum = 0;
int main (void) {
n = read();m = read();
for (int i = 1;i <= n;i++) {
a = read();
v.clear();
for (int i = 1;i <= a;i++) v.push_back(read());
sort (v.begin(),v.end());
for (int i = 1;i < a;i++)
res.push_back(v[i]-v[i-1]-1);
sum += v[a-1]-v[0]+1;
}
sort (res.begin(),res.end(),greater<int>());
for (int i = 0;i < res.size();i++) {
if (i >= m-1 || res[i] <= 0) break;
sum -= res[i];
}
printf ("%lld\n",sum);
return 0;
}