Use this to learn the idea, then write your own version.
1package main2 3import (4 . "fmt"5 "io"6)7 89func cf311E(in io.Reader, out io.Writer) {10 var n, m, fg, k, tar, w, id, ans int11 Fscan(in, &n, &m, &fg)12 13 st := n + m14 end := st + 115 type nb struct{ to, rid, cap int }16 g := make([][]nb, end+1)17 addEdge := func(from, to, cap int) {18 g[from] = append(g[from], nb{to, len(g[to]), cap})19 g[to] = append(g[to], nb{from, len(g[from]) - 1, 0})20 }21 22 sex := make([]bool, n)23 for i := range sex {24 Fscan(in, &sex[i])25 }26 for i, s := range sex {27 Fscan(in, &k)28 if !s {29 addEdge(st, i, k) 30 } else {31 addEdge(i, end, k) 32 }33 }34 for i := range m {35 Fscan(in, &tar, &w, &k)36 for range k {37 Fscan(in, &id)38 id--39 if tar == 0 {40 addEdge(n+i, id, 1e18) 41 } else {42 addEdge(id, n+i, 1e18) 43 }44 }45 ans += w 46 Fscan(in, &k)47 if tar == 0 {48 addEdge(st, n+i, w+k*fg) 49 } else {50 addEdge(n+i, end, w+k*fg)51 }52 }53 54 dis := make([]int, len(g))55 bfs := func() bool {56 clear(dis)57 dis[st] = 158 q := []int{st}59 for len(q) > 0 {60 v := q[0]61 q = q[1:]62 for _, e := range g[v] {63 if w := e.to; e.cap > 0 && dis[w] == 0 {64 dis[w] = dis[v] + 165 q = append(q, w)66 }67 }68 }69 return dis[end] > 070 }71 iter := make([]int, len(g))72 var dfs func(int, int) int73 dfs = func(v, totalFlow int) (curFlow int) {74 if v == end {75 return totalFlow76 }77 for ; iter[v] < len(g[v]); iter[v]++ {78 e := &g[v][iter[v]]79 if w := e.to; e.cap > 0 && dis[w] > dis[v] {80 f := dfs(w, min(totalFlow-curFlow, e.cap))81 if f == 0 {82 continue83 }84 e.cap -= f85 g[w][e.rid].cap += f86 curFlow += f87 if curFlow == totalFlow {88 break89 }90 }91 }92 return93 }94 maxFlow := 095 for bfs() {96 clear(iter)97 maxFlow += dfs(st, 1e18)98 }99 Fprint(out, ans-maxFlow)100}101 102103