#include using namespace std; #include template struct MoyasuUmeru { int n, s, t; T geta; vector> cost; atcoder::mf_graph graph; MoyasuUmeru(int n): n(n), s(n), t(n+1), geta(0), cost(2), graph(0) { graph = atcoder::mf_graph(n+2); cost[0].resize(n); cost[1].resize(n); } void add_cost(int i, int state, T val){ cost[state][i] += val; } void add_constraint(int x, int y, const vector> &cs){ T a = cs[0][0]; T b = cs[0][1]; T c = cs[1][0]; T d = cs[1][1]; geta += a; add_cost(x, 1, c - a); add_cost(y, 1, d - c); assert(b + c - a - d >= 0); graph.add_edge(x, y, b + c - a - d); } pair> solve(){ for (int i=0; i result = graph.min_cut(s); vector ret2(n); for (int i=0; i struct KvaluedMoyasuUmeru { int n; int alls; vector k; MoyasuUmeru mf; vector offset; T geta; KvaluedMoyasuUmeru(const vector &kk, T INF): k(kk), n((int)kk.size()), alls(0), geta(0), mf(0), offset(n) { for (int i=0; i= 1); } for (int i=0; i(alls); for (int i=0; i &val){ assert((int)val.size() == k[i]); geta += val[k[i]-1]; for (int j=0; j> &val){ assert((int)val.size() == k[x]); assert((int)val[0].size() == k[y]); vector add_to_x(k[x]); vector add_to_y(k[y]); for (int i=0; i> solve() { auto [old1, old2] = mf.solve(); T ret1 = old1 + geta; vector ret2(n); for (int i=0; i> n; KvaluedMoyasuUmeru mf(vector(n, 3), (ll)1e9); vector b(n), c(n); for (int i=0; i> b[i] >> c[i]; mf.add_1v(i, {-c[i], 0, -b[i]}); } int m; cin >> m; for (int i=0; i> d >> e; mf.add_2v(d, e, { {0, 0, 0}, {0, 0, 0}, {(ll)1e9, 0, 0} } ); } auto [x1, x2] = mf.solve(); cout << - x1 << '\n'; }