Guest User

Untitled

a guest
May 17th, 2025
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.67 KB | None | 0 0
  1. package main
  2. import (
  3. "bufio"
  4. "container/heap"
  5. "fmt"
  6. "math"
  7. "os"
  8. "strings"
  9. )
  10. type FastReader struct {
  11. r *bufio.Reader
  12. buf []byte
  13. pos int
  14. }
  15. func NewFastReader() *FastReader {
  16. return &FastReader{
  17. r: bufio.NewReaderSize(os.Stdin, 1<<20),
  18. }
  19. }
  20. func (fr *FastReader) readByte() (byte, error) {
  21. if fr.pos >= len(fr.buf) {
  22. var err error
  23. fr.buf, err = fr.r.ReadBytes('\n')
  24. if err != nil && len(fr.buf) == 0 {
  25. return 0, err
  26. }
  27. fr.pos = 0
  28. }
  29. b := fr.buf[fr.pos]
  30. fr.pos++
  31. return b, nil
  32. }
  33. func (fr *FastReader) readInt() (int64, error) {
  34. sign := int64(1)
  35. var x int64
  36. for {
  37. b, err := fr.readByte()
  38. if err != nil {
  39. return 0, err
  40. }
  41. if b == '-' {
  42. sign = -1
  43. break
  44. }
  45. if b >= '0' && b <= '9' {
  46. x = int64(b - '0')
  47. break
  48. }
  49. }
  50. for {
  51. b, err := fr.readByte()
  52. if err != nil || b < '0' || b > '9' {
  53. break
  54. }
  55. x = x*10 + int64(b-'0')
  56. }
  57. return sign * x, nil
  58. }
  59. func (fr *FastReader) readString(n int) (string, error) {
  60. res := make([]byte, n)
  61. i := 0
  62. for i < n {
  63. b, err := fr.readByte()
  64. if err != nil {
  65. return "", err
  66. }
  67. if b == '\n' || b == ' ' || b == '\r' {
  68. continue
  69. }
  70. res[i] = b
  71. i++
  72. }
  73. return string(res), nil
  74. }
  75. func (fr *FastReader) readLine() (string, error) {
  76. line, err := fr.r.ReadString('\n')
  77. return strings.TrimRight(line, "\r\n"), err
  78. }
  79. func readLine(fr *FastReader) (string, error) {
  80. return fr.readLine()
  81. }
  82. func readUint64(fr *FastReader) (uint64, error) {
  83. x, err := fr.readInt()
  84. return uint64(x), err
  85. }
  86. func maxInt(a, b int) int {
  87. if a > b {
  88. return a
  89. }
  90. return b
  91. }
  92. func minInt64(a, b int64) int64 {
  93. if a < b {
  94. return a
  95. }
  96. return b
  97. }
  98. const (
  99. intinf = math.MaxInt32
  100. intinfinf = math.MaxInt64
  101. )
  102. type prq []*pqitems
  103. func (pq prq) Len() int { return len(pq) }
  104. func (pq prq) Less(i, j int) bool { return pq[i].currmaxso < pq[j].currmaxso }
  105. func (pq prq) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] }
  106. func (pq *prq) Push(x interface{}) {
  107. *pq = append(*pq, x.(*pqitems))
  108. }
  109. func (pq *prq) Pop() interface{} {
  110. old := *pq
  111. n := len(old)
  112. item := old[n-1]
  113. *pq = old[:n-1]
  114. return item
  115. }
  116. var (
  117. ndim, tarrr int
  118. kbudget int64
  119. amat [][]int
  120. cmat [][]byte
  121. smmat [][]bool
  122. di = []int{-1, 0, 1, 0}
  123. dj = []int{0, -1, 0, 1}
  124. )
  125. type bfsstte struct{ r, c int }
  126. func poss(si, sj, ti, tj, thre int) bool {
  127. if amat[si][sj] > thre {
  128. return false
  129. }
  130. reached := make([][]bool, ndim)
  131. for i := range reached {
  132. reached[i] = make([]bool, ndim)
  133. }
  134. q := []bfsstte{{si, sj}}
  135. reached[si][sj] = true
  136. for head := 0; head < len(q); head++ {
  137. u := q[head]
  138. if u.r == ti && u.c == tj {
  139. return true
  140. }
  141. for d := 0; d < 4; d++ {
  142. ni, nj := u.r+di[d], u.c+dj[d]
  143. if ni >= 0 && ni < ndim && nj >= 0 && nj < ndim && !reached[ni][nj] && amat[ni][nj] <= thre {
  144. reached[ni][nj] = true
  145. q = append(q, bfsstte{ni, nj})
  146. }
  147. }
  148. }
  149. return false
  150. }
  151. type edger struct {
  152. to, rev int
  153. cap int64
  154. }
  155. var (
  156. network [][]edger
  157. lvld []int
  158. ptrd []int
  159. )
  160. func addedged(u, v int, c int64) {
  161. network[u] = append(network[u], edger{v, len(network[v]), c})
  162. network[v] = append(network[v], edger{u, len(network[u]) - 1, 0})
  163. }
  164. func bfsd(s, t int) bool {
  165. lvld = make([]int, len(network))
  166. for i := range lvld {
  167. lvld[i] = -1
  168. }
  169. q := []int{s}
  170. lvld[s] = 0
  171. for head := 0; head < len(q); head++ {
  172. u := q[head]
  173. for _, e := range network[u] {
  174. if e.cap > 0 && lvld[e.to] < 0 {
  175. lvld[e.to] = lvld[u] + 1
  176. q = append(q, e.to)
  177. }
  178. }
  179. }
  180. return lvld[t] >= 0
  181. }
  182. func dfsd(u, t int, f int64) int64 {
  183. if u == t {
  184. return f
  185. }
  186. for ptrd[u] < len(network[u]) {
  187. i := ptrd[u]
  188. e := &network[u][i]
  189. if e.cap > 0 && lvld[u] < lvld[e.to] {
  190. pushed := dfsd(e.to, t, minInt64(f, e.cap))
  191. if pushed > 0 {
  192. e.cap -= pushed
  193. network[e.to][e.rev].cap += pushed
  194. return pushed
  195. }
  196. }
  197. ptrd[u]++
  198. }
  199. return 0
  200. }
  201. func dinic(s, t int) int64 {
  202. flow := int64(0)
  203. for bfsd(s, t) {
  204. ptrd = make([]int, len(network))
  205. for {
  206. pushed := dfsd(s, t, intinfinf)
  207. if pushed == 0 {
  208. break
  209. }
  210. flow += pushed
  211. }
  212. }
  213. return flow
  214. }
  215. func canposs(mid int64) bool {
  216. if int64(amat[ndim-1][0]) >= mid || int64(amat[tarrr-1][ndim-1]) >= mid {
  217. return true
  218. }
  219. ttl := ndim * ndim
  220. network = make([][]edger, 2*ttl)
  221. src := (ndim-1)*ndim + 0
  222. sink := ttl + (tarrr-1)*ndim + (ndim - 1)
  223. for i := 0; i < ndim; i++ {
  224. for j := 0; j < ndim; j++ {
  225. if int64(amat[i][j]) >= mid {
  226. continue
  227. }
  228. in := i*ndim + j
  229. out := in + ttl
  230. var cap int64 = intinfinf
  231. if cmat[i][j] == '1' && !smmat[i][j] {
  232. cap = mid - int64(amat[i][j])
  233. }
  234. addedged(in, out, cap)
  235. for d := 0; d < 4; d++ {
  236. ni, nj := i+di[d], j+dj[d]
  237. if ni >= 0 && ni < ndim && nj >= 0 && nj < ndim && int64(amat[ni][nj]) < mid {
  238. addedged(out, ni*ndim+nj, intinfinf)
  239. }
  240. }
  241. }
  242. }
  243. return dinic(src, sink) <= kbudget
  244. }
  245. type pqitems struct {
  246. currmaxso, r, c int
  247. }
  248. func solve(fr *FastReader, writer *bufio.Writer) error {
  249. tmp, _ := fr.readInt()
  250. ndim = int(tmp)
  251. tmp, _ = fr.readInt()
  252. tarrr = int(tmp)
  253. kbudget, _ = fr.readInt()
  254. amat = make([][]int, ndim)
  255. for i := range amat {
  256. amat[i] = make([]int, ndim)
  257. for j := range amat[i] {
  258. tmp, _ = fr.readInt()
  259. amat[i][j] = int(tmp)
  260. }
  261. }
  262. cmat = make([][]byte, ndim)
  263. for i := 0; i < ndim; i++ {
  264. s, _ := fr.readString(ndim)
  265. cmat[i] = []byte(s)
  266. }
  267. low, high := 0, 1_000_000
  268. dsm := high + 1
  269. for low <= high {
  270. mid := (low + high) / 2
  271. if poss(0, 0, tarrr-1, ndim-1, mid) {
  272. dsm = mid
  273. high = mid - 1
  274. } else {
  275. low = mid + 1
  276. }
  277. }
  278. smmat = make([][]bool, ndim)
  279. for i := range smmat {
  280. smmat[i] = make([]bool, ndim)
  281. }
  282. maxst := make([][]int, ndim)
  283. for i := range maxst {
  284. maxst[i] = make([]int, ndim)
  285. for j := range maxst[i] {
  286. maxst[i][j] = intinf
  287. }
  288. }
  289. p := &prq{}
  290. heap.Init(p)
  291. maxst[0][0] = amat[0][0]
  292. heap.Push(p, &pqitems{amat[0][0], 0, 0})
  293. for p.Len() > 0 {
  294. cur := heap.Pop(p).(*pqitems)
  295. if cur.currmaxso > maxst[cur.r][cur.c] {
  296. continue
  297. }
  298. for d := 0; d < 4; d++ {
  299. ni, nj := cur.r+di[d], cur.c+dj[d]
  300. if ni >= 0 && ni < ndim && nj >= 0 && nj < ndim {
  301. nm := maxInt(cur.currmaxso, amat[ni][nj])
  302. if nm < maxst[ni][nj] {
  303. maxst[ni][nj] = nm
  304. heap.Push(p, &pqitems{nm, ni, nj})
  305. }
  306. }
  307. }
  308. }
  309. maxend := make([][]int, ndim)
  310. for i := range maxend {
  311. maxend[i] = make([]int, ndim)
  312. for j := range maxend[i] {
  313. maxend[i][j] = intinf
  314. }
  315. }
  316. *p = prq{}
  317. heap.Init(p)
  318. tr, tc := tarrr-1, ndim-1
  319. maxend[tr][tc] = amat[tr][tc]
  320. heap.Push(p, &pqitems{amat[tr][tc], tr, tc})
  321. for p.Len() > 0 {
  322. cur := heap.Pop(p).(*pqitems)
  323. if cur.currmaxso > maxend[cur.r][cur.c] {
  324. continue
  325. }
  326. for d := 0; d < 4; d++ {
  327. ni, nj := cur.r+di[d], cur.c+dj[d]
  328. if ni >= 0 && ni < ndim && nj >= 0 && nj < ndim {
  329. nm := maxInt(cur.currmaxso, amat[ni][nj])
  330. if nm < maxend[ni][nj] {
  331. maxend[ni][nj] = nm
  332. heap.Push(p, &pqitems{nm, ni, nj})
  333. }
  334. }
  335. }
  336. }
  337. for i := 0; i < ndim; i++ {
  338. for j := 0; j < ndim; j++ {
  339. smmat[i][j] = (maxst[i][j] == dsm && maxend[i][j] == dsm)
  340. }
  341. }
  342. lwf, hff := int64(0), int64(1_000_000)+kbudget
  343. var dsf int64
  344. for lwf <= hff {
  345. mid := (lwf + hff + 1) / 2
  346. if canposs(mid) {
  347. dsf = mid
  348. lwf = mid + 1
  349. } else {
  350. hff = mid - 1
  351. }
  352. }
  353. fmt.Println(dsm, dsf)
  354. return nil
  355. }
  356. func main() {
  357. fr := NewFastReader()
  358. writer := bufio.NewWriter(os.Stdout)
  359. defer writer.Flush()
  360. tt, _ := fr.readInt()
  361. t := int(tt)
  362. for i := 0; i < t; i++ {
  363. if err := solve(fr, writer); err != nil {
  364. panic(err)
  365. }
  366. }
  367. }
Advertisement
Add Comment
Please, Sign In to add comment