Advertisement
a53

bemo

a53
Jan 31st, 2021
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. // Mugurel Ionut Andreica
  2. // O(M * N * log(M + N))
  3. // FARA citire parsata.
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8.  
  9. #define NMAX 2011
  10.  
  11. int A[NMAX][NMAX], row[NMAX * NMAX], col[NMAX * NMAX];
  12. int M, N;
  13.  
  14. void ReadInput() {
  15. int i, j;
  16.  
  17. freopen("bemo.in", "r", stdin);
  18. scanf("%d %d", &M, &N);
  19. for (i = 1; i <= M; i++)
  20. for (j = 1; j <= N; j++) {
  21. scanf("%d", &A[i][j]);
  22. row[A[i][j]] = i;
  23. col[A[i][j]] = j;
  24. }
  25. }
  26.  
  27. char selected[NMAX * NMAX];
  28. int elems[2 * NMAX], nelems;
  29.  
  30. void Solve() {
  31. int i, j, li, ls, mid, before;
  32.  
  33. memset(selected, 0, sizeof(selected));
  34. selected[A[1][1]] = 1;
  35. nelems = 1;
  36. elems[1] = A[1][1];
  37.  
  38. if (M == 1 && N == 1)
  39. return;
  40.  
  41. selected[A[M][N]] = 1;
  42. nelems++;
  43. elems[nelems] = A[M][N];
  44.  
  45. for (i = 1; i <= M * N && nelems < M + N - 1; i++) {
  46. if (selected[i])
  47. continue;
  48.  
  49. // Check if we can add i to the path.
  50. li = 1; ls = nelems; before = 0;
  51.  
  52. while (li <= ls) {
  53. mid = (li + ls) / 2;
  54. if (row[elems[mid]] <= row[i] && col[elems[mid]] <= col[i]) {
  55. before = mid;
  56. li = mid + 1;
  57. } else
  58. ls = mid - 1;
  59. }
  60.  
  61. if (before == 0)
  62. continue;
  63.  
  64. if (row[i] <= row[elems[before + 1]] && col[i] <= col[elems[before + 1]]) {
  65. // Insert i on position before + 1.
  66. for (j = nelems; j > before; j--)
  67. elems[j + 1] = elems[j];
  68. elems[before + 1] = i;
  69. nelems++;
  70. selected[i] = 1;
  71. }
  72. }
  73.  
  74. if (nelems != M + N - 1) {
  75. fprintf(stderr, "Not eneough elements selected!\n");
  76. exit(1);
  77. }
  78. }
  79.  
  80. void WriteOutput() {
  81. int i;
  82.  
  83. freopen("bemo.out", "w", stdout);
  84. for (i = 1; i <= nelems; i++) {
  85. printf("%d", elems[i]);
  86. if (i < nelems)
  87. printf(" ");
  88. }
  89. printf("\n");
  90. }
  91.  
  92. int main() {
  93. ReadInput();
  94. Solve();
  95. WriteOutput();
  96. return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement