a53

lumini2

a53
Mar 25th, 2020
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.70 KB | None | 0 0
  1. #include <fstream>
  2. #include <queue>
  3. #define nmax 1005
  4. #define pmax 256
  5. using namespace std;
  6. ifstream f("lumini.in");
  7. ofstream g("lumini.out");
  8. int n, m, h[pmax * pmax *pmax + 5];
  9.  
  10. class color {
  11.  
  12. public:
  13.  
  14. int r, g, b;
  15. int get_hash() const {
  16. return r * 256 * 256 + g * 256 + b;
  17. }
  18. int get_opposite_hash() const {
  19.  
  20. color p;
  21. p.r = 256 - r;
  22. p.g = 256 - g;
  23. p.b = 256 - b;
  24. p.r %= 256; p.g %= 256; p.b %= 256;
  25. return p.get_hash();
  26. }
  27. int get_intensity() const {
  28. int x = 0, y = 0, z = 0;
  29.  
  30. if (r)
  31. x = g / r;
  32. if (g)
  33. y = b / g;
  34. if (b)
  35. z = r / b;
  36.  
  37. return (x * x + y * y + z * z) * 1000;
  38. };
  39. } v[nmax][nmax];
  40.  
  41. #include <set>
  42.  
  43. set <int> my_set[nmax * nmax];
  44. const int dl[4] = {-1, 1, 0, 0};
  45. const int dc[4] = {0, 0, 1, -1};
  46. int zone[nmax][nmax], nr_zone;
  47.  
  48. void clear() {
  49. for (int i = 1; i <= nr_zone; i++)
  50. my_set[i].clear();
  51.  
  52. for (int i = 1; i <= n; i++)
  53. for (int j = 1; j <= m; j++)
  54. zone[i][j] = 0;
  55. nr_zone = 0;
  56. }
  57.  
  58. int verify(int sol)
  59. {
  60. int i, j;
  61. queue <pair<int, int > > q;
  62. for (i = 1; i <= n; i++)
  63. for (j = 1; j <= m; j++) {
  64. if (zone[i][j] == 0) {
  65. zone[i][j] = ++nr_zone;
  66. q.push(make_pair(i,j));
  67. while (!q.empty()) {
  68. int x = q.front().first;
  69. int y = q.front().second;
  70. q.pop();
  71.  
  72. for (int k = 0; k < 4; k++) {
  73. int i1 = x+ dl[k];
  74. int j1 = y + dc[k];
  75. if (i1 >= 1 && i1 <= n && j1 >= 1 && j1 <= m)
  76. if (zone[i1][j1] == 0)
  77. if (abs(v[x][y].get_intensity() - v[i1][j1].get_intensity()) <= sol) {
  78.  
  79. zone[i1][j1] = zone[x][y];
  80. set <int> :: iterator it = my_set[zone[i1][j1]].find(v[i1][j1].get_opposite_hash());
  81. if (it != my_set[zone[i1][j1]].end()) {
  82. clear(); return false;
  83. }
  84. my_set[zone[i1][j1]].insert(v[i1][j1].get_hash());
  85. q.push(make_pair(i1, j1));
  86. }
  87. }
  88. }
  89. }
  90. }
  91. clear();
  92. return true;
  93. }
  94.  
  95. int main()
  96. {
  97. int i, j, cer;
  98. f >> n >> m >> cer;
  99. for (i = 1; i <= n; i++)
  100. for (j = 1; j <= m; j++) {
  101. f >> v[i][j].r >> v[i][j].g >> v[i][j].b;
  102. h[v[i][j].get_hash()] ++;
  103.  
  104. //g << v[i][j].get_hash() << '\n';
  105. }
  106. if (cer == 1) {
  107. color mid;
  108. mid.r = 128;
  109. mid.g = 128;
  110. mid.b = 128;
  111.  
  112. long long cnt = 1LL * h[0] * (h[0] - 1) + 1LL * h[mid.get_hash()] * (h[mid.get_hash()] - 1);
  113. for (i = 1; i <= n; i++)
  114. for (j = 1; j <= m; j++)
  115. if ((v[i][j].r == 0 && v[i][j].g == 0 && v[i][j].b == 0) ||
  116. (v[i][j].r == 128 && v[i][j].g == 128 && v[i][j].b == 128)) {
  117. } else {
  118. cnt += h[v[i][j].get_opposite_hash()];
  119. }
  120.  
  121. g << cnt / 2 << '\n';
  122. return 0;
  123. }
  124.  
  125. /*
  126. for (i = 1; i <= n; i++) {
  127. for (j = 1; j <= m; j++)
  128. g << v[i][j].get_intensity() << ' ';
  129. g << '\n';
  130. }*/
  131.  
  132. int sol = 0;
  133. for (i = 1 << 26; i; i >>= 1) {
  134. if (verify(sol + i))
  135. sol += i;
  136. }
  137. g << sol << '\n';
  138.  
  139. return 0;
  140. }
Add Comment
Please, Sign In to add comment