1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
#include <bits/stdc++.h> using namespace std; #define int long long #define resetIO(x) \ freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout) #define debug(fmt, ...) \ fprintf(stderr, "[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) template <class _Tp> inline _Tp& read(_Tp& x) { bool sign = false; char ch = getchar(); long double tmp = 1; for (; !isdigit(ch); ch = getchar()) sign |= (ch == '-'); for (x = 0; isdigit(ch); ch = getchar()) x = x * 10 + (ch ^ 48); if (ch == '.') for (ch = getchar(); isdigit(ch); ch = getchar()) tmp /= 10.0, x += tmp * (ch ^ 48); return sign ? (x = -x) : x; } template <class _Tp> inline void write(_Tp x) { if (x < 0) putchar('-'), x = -x; if (x > 9) write(x / 10); putchar((x % 10) ^ 48); } template <const int MAXV, const int MAXE> struct MCMF { const int INF = 0x3f3f3f3f3f3f3f3f; struct Edge { int v, flow, cost; } edge[MAXE * 2]; int tot = 1, head[MAXV], nxt[MAXE]; int flow, cost, cur[MAXV], dis[MAXV]; bool vis[MAXV]; void addedge(int u, int v, int flow, int cost) { edge[++tot] = {v, flow, cost}; nxt[tot] = head[u], head[u] = tot; edge[++tot] = {u, 0, -cost}; nxt[tot] = head[v], head[v] = tot; } bool spfa(int s, int t) { fill(vis, vis + MAXV, 0); fill(dis, dis + MAXV, -INF); queue<int> que; que.push(s); dis[s] = 0; vis[s] = 1; while (!que.empty()) { int u = que.front(); que.pop(); vis[u] = 0; for (int i = head[u]; i; i = nxt[i]) { int v = edge[i].v; if (edge[i].flow && dis[v] < dis[u] + edge[i].cost) { dis[v] = dis[u] + edge[i].cost; if (!vis[v]) { que.push(v); vis[v] = 1; } } } } return dis[t] != -INF; } int augment(int u, int t, int mx) { if (u == t || mx == 0) return mx; vis[u] = 1; int ret = 0; for (int &i = cur[u]; i; i = nxt[i]) { int v = edge[i].v; if (vis[v] || dis[v] != dis[u] + edge[i].cost) continue; int tmp = augment(v, t, min(mx, edge[i].flow)); cost += tmp * edge[i].cost; mx -= tmp, ret += tmp; edge[i].flow -= tmp, edge[i ^ 1].flow += tmp; if (mx == 0) break; } vis[u] = 0; return ret; } pair<int, int> mcmf(int s, int t) { while (spfa(s, t)) { copy(head, head + MAXV, cur); flow += augment(s, t, INF); } return make_pair(flow, cost); } }; const int MAXN = 1e3 + 10; const int MAXM = 1e4 + 10; const int INF = 0x3f3f3f3f3f3f3f3f; int n, k, m, a[MAXN], l[MAXN], r[MAXN], p[MAXN]; MCMF<MAXN, MAXM> network; signed main() { read(n), read(k); for (int i = 1; i <= n; ++i) { read(l[i]), read(r[i]); p[++m] = l[i], p[++m] = r[i]; a[i] = r[i] - l[i]; } p[++m] = -INF, p[++m] = INF; sort(p + 1, p + m + 1); m = unique(p + 1, p + m + 1) - p - 1; for (int i = 1; i <= n; ++i) { l[i] = lower_bound(p + 1, p + m + 1, l[i]) - p; r[i] = lower_bound(p + 1, p + m + 1, r[i]) - p; network.addedge(l[i], r[i], 1, a[i]); } for (int i = 1; i < m; ++i) network.addedge(i, i + 1, k, 0); write(network.mcmf(1, m).second), putchar('\n'); return 0; }
|