static object Solve() { var(p, q) = Read2(); var s = Array.ConvertAll(new bool[p], _ => Console.ReadLine()); var ps = Array.ConvertAll(new bool[p], _ => Read2L()); var qs = Array.ConvertAll(new bool[q], _ => Read2L()); var sv = p + q; var ev = sv + 1; var mf = new MinCostFlow(ev + 1); for (int i = 0; i < p; ++i) { mf.AddEdge(sv, i, 1, 0); } for (int j = 0; j < q; ++j) { mf.AddEdge(p + j, ev, 1, 0); } for (int i = 0; i < p; ++i) { var pa = ps[i].a - ps[i].b; for (int j = 0; j < q; ++j) { var qa = qs[j].a - qs[j].b; if (s[i][j] == '1' && pa + qa > 0) { mf.AddEdge(i, p + j, 1, -pa - qa); } } } var r0 = ps.Sum(_ => _.b) + qs.Sum(_ => _.b); var r = mf.GetMinCostForRange(sv, ev, Math.Min(p, q)); if (r == long.MaxValue) { r = 0; } return(r0 - r); }
static object Solve() { var(n, c) = Read2(); var a = Read(); var sv = 2 * n; var ev = sv + 1; var mf = new MinCostFlow(ev + 1); for (int i = 0; i < n; ++i) { mf.AddEdge(sv, i, 1, c); mf.AddEdge(n + i, ev, 1, 0); mf.AddEdge(i, n + i, 1, -max); for (int j = i + 1; j < n; j++) { mf.AddEdge(n + i, j, 1, Math.Abs(a[i] - a[j])); } } return(mf.GetMinCostForRange(sv, ev, n) + n * max); }