Advertisement
Guest User

lol

a guest
Feb 27th, 2020
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.01 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.StringTokenizer;
  6.  
  7. /*
  8. ID: leedsja1
  9. LANG: JAVA
  10. TASK: problem
  11. */
  12. public class art { //Class name
  13. public static void main(String[] args) throws IOException{
  14. FastScanner f = new FastScanner("art.in");
  15. PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("art.out")));
  16. int n = f.nextInt();
  17. int[][] canvas = new int[n][n];
  18. for (int x = 0; x < n; x++) {
  19. for (int y = 0; y < n; y++) {
  20. canvas[x][y] = f.nextInt();
  21. }
  22. }
  23. Rectangle[] rectangles = new Rectangle[n*n+1];
  24. int numRectangles = 0;
  25. for (int x = 0; x < n; x++) {
  26. for (int y = 0; y < n; y++) {
  27. if (canvas[x][y] != 0 && rectangles[canvas[x][y]] == null) {
  28. rectangles[canvas[x][y]] = new Rectangle(x, y, canvas[x][y]);
  29. numRectangles++;
  30. } else if (canvas[x][y] != 0){
  31. Rectangle r = rectangles[canvas[x][y]];
  32. if (x < r.x1) r.x1 = x;
  33. if (x > r.x2) r.x2 = x;
  34. if (y < r.y1) r.y1 = y;
  35. if (y > r.y2) r.y2 = y;
  36. }
  37. }
  38. }
  39. if (numRectangles == 1) {
  40. out.print(n * n - 1);
  41. out.close();
  42. return;
  43. }
  44.  
  45. ArrayList<Rectangle> rectangleList = new ArrayList<Rectangle>();
  46. for (int i = 1; i < n*n+1; i++) if (rectangles[i] != null) rectangleList.add(rectangles[i]);
  47. ArrayList<Rectangle> x1Rectangles = new ArrayList<>(rectangleList);
  48. ArrayList<Rectangle> x2Rectangles = new ArrayList<>(rectangleList);
  49. ArrayList<Rectangle> y1Rectangles = new ArrayList<>();
  50. ArrayList<Rectangle> y2Rectangles = new ArrayList<>();
  51. Collections.sort(x1Rectangles, new x1Comparator());
  52. Collections.sort(x2Rectangles, new x2Comparator());
  53. boolean[] current = new boolean[n * n + 1];
  54. boolean[] impossible = new boolean[n * n + 1];
  55. int curNum = 0;
  56. int xInserted = 0;
  57. int xRemoved = 0;
  58. for (int x = 0; x < n; x++) {
  59. while (xInserted < x1Rectangles.size() && x1Rectangles.get(xInserted).x1 == x) {
  60. Rectangle r = x1Rectangles.get(xInserted);
  61. xInserted++;
  62. int index = Collections.binarySearch(y1Rectangles, r, new y1Comparator());
  63. if (index < 0) index = index * -1 - 1;
  64. y1Rectangles.add(index, r);
  65. index = Collections.binarySearch(y2Rectangles, r, new y2Comparator());
  66. if (index < 0) index = index * -1 - 1;
  67. y2Rectangles.add(index, r);
  68. }
  69. int yInserted = 0;
  70. int yRemoved = 0;
  71. for (int y = 0; y < n; y++) {
  72. while (yInserted < y1Rectangles.size() && y1Rectangles.get(yInserted).y1 == y) {
  73. Rectangle r = y1Rectangles.get(yInserted);
  74. yInserted++;
  75. current[r.value] = true;
  76. curNum++;
  77. }
  78. if (curNum >= 2) {
  79. impossible[canvas[x][y]] = true;
  80. }
  81. while (yRemoved < y2Rectangles.size() && y2Rectangles.get(yRemoved).y2 == y) {
  82. Rectangle r = y2Rectangles.get(yRemoved);
  83. yRemoved++;
  84. current[r.value] = false;
  85. curNum--;
  86. }
  87. }
  88.  
  89. while (xRemoved < x2Rectangles.size() && x2Rectangles.get(xRemoved).x2 == x) {
  90. Rectangle r = x2Rectangles.get(xRemoved);
  91. xRemoved++;
  92. int index = Collections.binarySearch(y1Rectangles, r, new y1Comparator());
  93. y1Rectangles.remove(index);
  94. index = Collections.binarySearch(y2Rectangles, r, new y2Comparator());
  95. y2Rectangles.remove(index);
  96. }
  97. }
  98.  
  99. int result = 0;
  100. for (int i = 1; i <= n * n; i++) {
  101. if (!impossible[i]) result++;
  102. }
  103.  
  104. out.print(result);
  105. out.close();
  106. }
  107.  
  108. static class x1Comparator implements Comparator<Rectangle> {
  109. @Override
  110. public int compare(Rectangle a, Rectangle b) {
  111. if (a.x1 > b.x1) return 1;
  112. if (a.x1 < b.x1) return -1;
  113. return 0;
  114. }
  115. }
  116. static class x2Comparator implements Comparator<Rectangle> {
  117. @Override
  118. public int compare(Rectangle a, Rectangle b) {
  119. if (a.x2 > b.x2) return 1;
  120. if (a.x2 < b.x2) return -1;
  121. return 0;
  122. }
  123. }
  124. static class y1Comparator implements Comparator<Rectangle> {
  125. @Override
  126. public int compare(Rectangle a, Rectangle b) {
  127. if (a.y1 > b.y1) return 1;
  128. if (a.y1 < b.y1) return -1;
  129. return 0;
  130. }
  131. }
  132. static class y2Comparator implements Comparator<Rectangle> {
  133. @Override
  134. public int compare(Rectangle a, Rectangle b) {
  135. if (a.y2 > b.y2) return 1;
  136. if (a.y2 < b.y2) return -1;
  137. return 0;
  138. }
  139. }
  140.  
  141. static class Rectangle {
  142. int x1;
  143. int y1;
  144. int x2;
  145. int y2;
  146. int value;
  147.  
  148. public Rectangle (int x, int y, int v){
  149. x1 = x;
  150. x2 = x;
  151. y1 = y;
  152. y2 = y;
  153. value = v;
  154. }
  155.  
  156. }
  157.  
  158. static class FastScanner {
  159. BufferedReader br;
  160. StringTokenizer st;
  161.  
  162. public FastScanner(String s) {
  163. try {
  164. br = new BufferedReader(new FileReader(s));
  165. } catch (FileNotFoundException e) {
  166. // TODO Auto-generated catch block
  167. e.printStackTrace();
  168. }
  169. }
  170.  
  171. public FastScanner() {
  172. br = new BufferedReader(new InputStreamReader(System.in));
  173. }
  174.  
  175. String nextToken() {
  176. while (st == null || !st.hasMoreElements()) {
  177. try {
  178. st = new StringTokenizer(br.readLine());
  179. } catch (IOException e) {
  180. // TODO Auto-generated catch block
  181. e.printStackTrace();
  182. }
  183. }
  184. return st.nextToken();
  185. }
  186.  
  187. String nextLine() {
  188. st = null;
  189. try {
  190. return br.readLine();
  191. } catch (IOException e) {
  192. // TODO Auto-generated catch block
  193. e.printStackTrace();
  194. }
  195. return null;
  196. }
  197.  
  198. int nextInt() {
  199. return Integer.parseInt(nextToken());
  200. }
  201.  
  202. long nextLong() {
  203. return Long.parseLong(nextToken());
  204. }
  205.  
  206. double nextDouble() {
  207. return Double.parseDouble(nextToken());
  208. }
  209. }
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement