Advertisement
a53

margi

a53
Jul 12th, 2019
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. // N*log(N)
  2. # include <bits/stdc++.h>
  3. # define NR 1050
  4. using namespace std;
  5. ifstream f("margi.in");
  6. ofstream g("margi.out");
  7. struct elem {
  8. int maxim, x, y;
  9. }maxx1, maxx2;
  10.  
  11. int maxim, C, n, N;
  12. int a[NR][NR], S[NR][NR];
  13. char s[NR];
  14.  
  15. int suma_mat (int x, int y, int nivel) {
  16. int x2=x + (1<<nivel) - 1;
  17. int y2=y + (1<<nivel) - 1;
  18.  
  19. return S[x2][y2] - S[x-1][y2] - S[x2][y-1] + S[x-1][y-1];
  20. }
  21. elem cauta_sol (int x, int y, int nivel, int sumaAnt) {
  22. int xmij=x + (1<<(nivel-1));
  23. int ymij=y + (1<<(nivel-1));
  24.  
  25. // caut primele doua maxime
  26. elem sol; sol.maxim=-1;
  27. if (nivel >= 1) { // daca patratul se mai divide in continuare
  28. elem aux[5];
  29. aux[1] = cauta_sol (x, y, nivel-1, sumaAnt + suma_mat(x, y, nivel-1));
  30. aux[2] = cauta_sol (x, ymij, nivel-1, sumaAnt + suma_mat(x, y, nivel-1));
  31. aux[3] = cauta_sol (xmij, y, nivel-1, sumaAnt + suma_mat(x, y, nivel-1));
  32. aux[4] = cauta_sol (xmij, ymij, nivel-1, sumaAnt + suma_mat(x, y, nivel-1));
  33.  
  34. for (int i=1; i<=4; ++i) {
  35. if (aux[i].maxim > sol.maxim) sol=aux[i];
  36. for (int j=i+1; j<=4; ++j) {
  37. if (sumaAnt + aux[i].maxim + aux[j].maxim > maxim) {
  38. maxim = aux[i].maxim + aux[j].maxim + sumaAnt;
  39. maxx1 = aux[i];
  40. maxx2 = aux[j];
  41. }
  42. }
  43. }
  44. sol.maxim += suma_mat(x, y, nivel);
  45. } else { // am ajuns intr-un patratel
  46. if (sumaAnt > maxim) {
  47. maxim=sumaAnt;
  48.  
  49. maxx1.maxim = sumaAnt; maxx1.x = x; maxx1.y = y;
  50. maxx2.maxim = 0; maxx2.x = x; maxx2.y = y;
  51. }
  52. sol.maxim=a[x][y];
  53. sol.x=x; sol.y=y;
  54. }
  55.  
  56. //functia returneaza suma maxima care se poate obtine de un jucator
  57. //daca ar incpe in acest patrat
  58. return sol;
  59. }
  60. void make_drum (int x, int y, int nivel, int X, int Y) {
  61. // if (nivel!=n) g<<(x-1) * N + y<<" ";
  62.  
  63. if (nivel==0) {
  64. g<<"\n";
  65. } else {
  66. int xmij=x + (1<<(nivel-1));
  67. int ymij=y + (1<<(nivel-1));
  68.  
  69. if (X<xmij && Y<ymij) {g<<"1 "; make_drum(x, y, nivel-1, X, Y);}
  70. if (X<xmij && Y>=ymij) {g<<"2 "; make_drum(x, ymij, nivel-1, X, Y);}
  71. if (X>=xmij && Y<ymij) {g<<"3 "; make_drum(xmij, y, nivel-1, X, Y);}
  72. if (X>=xmij && Y>=ymij) {g<<"4 "; make_drum(xmij, ymij, nivel-1, X, Y);}
  73. }
  74. }
  75. int main ()
  76. {
  77. f>>C>>n; f.get();
  78. N=(1<<n);
  79.  
  80. for (int i=1; i<=N; ++i) {
  81. f.getline (s+1, NR);
  82. for (int j=1; j<=N; ++j) {
  83. a[i][j]=s[j] - '0';
  84. S[i][j]=S[i-1][j] + S[i][j-1] - S[i-1][j-1] + a[i][j];
  85. }
  86. }
  87. maxim=-1;
  88. cauta_sol (1, 1, n, 0);
  89.  
  90. g<<maxim<<"\n";
  91. if(C==2)
  92. make_drum (1, 1, n, maxx1.x, maxx1.y),make_drum (1, 1, n, maxx2.x, maxx2.y);
  93. return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement