tiom4eg

AGC034D AC!!!

May 3rd, 2022
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.64 KB | None | 0 0
  1. // LETS FUCKING GO
  2.  
  3. struct Edge {
  4. to: int,
  5. next: int,
  6. cap: int,
  7. cost: int
  8. }
  9.  
  10. struct Queue {
  11. l: int[],
  12. r: int[],
  13. function push(self: Queue, x: int) { self.l.push(x); }
  14. function pop(self: Queue) -> int {
  15. if (self.r.length() > 0) {
  16. let x = self.r[self.r.length() - 1];
  17. self.r.pop();
  18. return x;
  19. }
  20. while (self.l.length() > 0) {
  21. let x = self.l[self.l.length() - 1];
  22. self.l.pop();
  23. self.r.push(x);
  24. }
  25. let x = self.r[self.r.length() - 1];
  26. self.r.pop();
  27. return x;
  28. }
  29. function empty(self: Queue) -> bool { return (self.l.length() + self.r.length()) == 0; }
  30. }
  31.  
  32. function min(a: int, b: int) -> int {
  33. if (a < b) { return a; }
  34. return b;
  35. }
  36.  
  37. function add_edge(by: int, to: int, cap: int, cost: int, edges: Edge[], head: int[], cur_edge: int[]) {
  38. cur_edge[0] += 1;
  39. edges[cur_edge[0]] = new Edge { to: to, next: head[by], cap: cap, cost: cost };
  40. head[by] = cur_edge[0];
  41. }
  42.  
  43. function add(u: int, v: int, cap: int, cost: int, edges: Edge[], head: int[], cur_edge: int[]) {
  44. add_edge(u, v, cap, cost, edges, head, cur_edge);
  45. add_edge(v, u, 0, -cost, edges, head, cur_edge);
  46. }
  47.  
  48. function spfa(n: int, s: int, t: int, pre: int[], vis: int[], c: int[], edges: Edge[], head: int[]) -> bool {
  49. for (let i = 1; i <= n; i += 1) { pre[i] = -1; vis[i] = 0; c[i] = 1000000000000000000; }
  50. let q = new Queue { l: [], r: [] };
  51. q.push(s);
  52. vis[s] = 1; c[s] = 0;
  53. while (!q.empty()) {
  54. let u = q.pop();
  55. vis[u] = 0;
  56. for (let i = head[u]; i > 0; i = edges[i].next) {
  57. let v = edges[i].to;
  58. if (edges[i].cap != 0 && c[v] > c[u] + edges[i].cost) {
  59. c[v] = c[u] + edges[i].cost;
  60. pre[v] = i;
  61. if (vis[v] == 0) {
  62. vis[v] = 1;
  63. q.push(v);
  64. }
  65. }
  66. }
  67.  
  68. }
  69. return pre[t] != -1;
  70. }
  71.  
  72. function mcmf(n: int, s: int, t: int, pre: int[], vis: int[], c: int[], edges: Edge[], head: int[]) -> int {
  73. let max_flow = 0;
  74. let min_cost = 0;
  75. while (spfa(n, s, t, pre, vis, c, edges, head)) {
  76. let x = t;
  77. let flow = 1000000000;
  78. while (x != s) { flow = min(flow, edges[pre[x]].cap); x = edges[pre[x] ^ 1].to; }
  79. max_flow += flow;
  80. x = t;
  81. min_cost += c[t] * flow;
  82. while (x != s) {
  83. edges[pre[x]].cap -= flow;
  84. edges[pre[x] ^ 1].cap += flow;
  85. x = edges[pre[x] ^ 1].to;
  86. }
  87. }
  88. return min_cost;
  89. }
  90.  
  91. function solve(input: string) -> string {
  92. let z = input.split("\n");
  93. let n = int(z[0]);
  94. let rx: int[] = [0];
  95. let ry: int[] = [0];
  96. let rc: int[] = [0];
  97. for (let i = 1; i <= n; i += 1) {
  98. let ps = z[i].split(" ");
  99. rx.push(int(ps[0]));
  100. ry.push(int(ps[1]));
  101. rc.push(int(ps[2]));
  102. }
  103. let bx: int[] = [0];
  104. let by: int[] = [0];
  105. let bc: int[] = [0];
  106. for (let i = n + 1; i <= 2 * n; i += 1) {
  107. let ps = z[i].split(" ");
  108. bx.push(int(ps[0]));
  109. by.push(int(ps[1]));
  110. bc.push(int(ps[2]));
  111. }
  112. let maxn = 25000;
  113. let head: int[] = [];
  114. let vis: int[] = [];
  115. let pre: int[] = [];
  116. let c: int[] = [];
  117. let edges: Edge[] = [];
  118. for (let i = 0; i < maxn; i += 1) { head.push(0); }
  119. for (let i = 0; i < maxn; i += 1) { vis.push(0); }
  120. for (let i = 0; i < maxn; i += 1) { pre.push(0); }
  121. for (let i = 0; i < maxn; i += 1) { c.push(0); }
  122. for (let i = 0; i < maxn; i += 1) { edges.push(new Edge { to: -1, next: -1, cap: -1, cost: -1 }); }
  123. let cur_edge = [1];
  124. let tp1 = 2 * n + 1;
  125. let tp2 = 2 * n + 2;
  126. let tp3 = 2 * n + 3;
  127. let tp4 = 2 * n + 4;
  128. let s = 2 * n + 5;
  129. let t = 2 * n + 6;
  130. for (let i = 1; i <= n; i += 1) {
  131. add(s, i, rc[i], 0, edges, head, cur_edge);
  132. add(n + i, t, bc[i], 0, edges, head, cur_edge);
  133. }
  134. for (let i = 1; i <= n; i += 1) {
  135. add(i, tp1, rc[i], -(rx[i] + ry[i]), edges, head, cur_edge);
  136. add(i, tp2, rc[i], -(rx[i] - ry[i]), edges, head, cur_edge);
  137. add(i, tp3, rc[i], -(-rx[i] + ry[i]), edges, head, cur_edge);
  138. add(i, tp4, rc[i], -(-rx[i] - ry[i]), edges, head, cur_edge);
  139. }
  140. for (let i = 1; i <= n; i += 1) {
  141. add(tp1, n + i, bc[i], -(-bx[i] - by[i]), edges, head, cur_edge);
  142. add(tp2, n + i, bc[i], -(-bx[i] + by[i]), edges, head, cur_edge);
  143. add(tp3, n + i, bc[i], -(bx[i] - by[i]), edges, head, cur_edge);
  144. add(tp4, n + i, bc[i], -(bx[i] + by[i]), edges, head, cur_edge);
  145. }
  146. n = t;
  147. let ans = mcmf(n, s, t, pre, vis, c, edges, head);
  148. return string(-ans);
  149. }
Add Comment
Please, Sign In to add comment