Advertisement
Guest User

Untitled

a guest
Nov 26th, 2015
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.37 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #pragma comment(linker, "/STACK:66777216")
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <cmath>
  6. #include <vector>
  7. #include <ctime>
  8. #include <map>
  9. #include <set>
  10. #include <string>
  11. #include <queue>
  12. #include <deque>
  13. #include <cassert>
  14. #include <cstdlib>
  15. #include <bitset>
  16. #include <algorithm>
  17. #include <string>
  18. #include <list>
  19. #include <fstream>
  20. #include <sstream>
  21. #include <unordered_set>
  22. using namespace std;
  23.  
  24. typedef unsigned long long ull;
  25. typedef long long ll;
  26. typedef long double ld;
  27.  
  28. #define foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
  29. #define forn(i, n) for (int i = 0; i < (int)n; i++)
  30. #define fornn(i, q, n) for (int i = q; i < (int)n; i++)
  31. #define mp make_pair
  32. #define pk push_back
  33. #define all(v) v.begin(), v.end()
  34. #define times clock() * 1.0 / CLOCKS_PER_SEC
  35.  
  36. #define TASK "selfdual"
  37.  
  38. const double EPS = 1e-7;
  39.  
  40. const ll inf = (ll)2e9 + 7;
  41. const ll LINF = (ll)9e18 + 7;
  42. const ll MM = (ll)1e9 + 7;
  43.  
  44. int solve();
  45.  
  46. int main()
  47. {
  48. #ifdef _DEBUG
  49. freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
  50. #else
  51. //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  52. //freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout), freopen("test.txt", "w", stderr);
  53. #endif
  54. solve();
  55. return 0;
  56. }
  57. int a[3000][3000];
  58. int l[100007];
  59.  
  60.  
  61. int solve() {
  62. l[1] = 0;
  63. fornn(i, 2, (int)1e5)
  64. l[i] = l[i / 2] + 1;
  65. l[0] = l[1] = 1;
  66. int n, m;
  67. cin >> n >> m;
  68. if (n == 1) {
  69. cout << 0;
  70. return 0;
  71. }
  72. vector<vector<int> > w(n, vector<int>(m));
  73. set<int> q;
  74. int mx = 0;
  75. forn(i, n) {
  76. forn(j, m) {
  77. cin >> w[i][j];
  78. mx = max(mx, w[i][j]);
  79. }
  80. }
  81. if (mx <= 200 && n > 40) {
  82. int k = (l[n] + 1) / 2;
  83. char t1[10007][207];
  84. forn(i, n) {
  85. forn(j, m) {
  86. t1[i][w[i][j]] = true;
  87. }
  88. }
  89. forn(i, 1 << k) {
  90. forn(j, 1 << k) {
  91. forn(l, k)
  92. a[i][j] += ((j & (1 << l)) > 0) * ((i & (1 << l)) > 0);
  93. }
  94. }
  95. vector<vector<int> > e(n);
  96. forn(i, n) {
  97. for (int r = 0; r < mx; r += k) {
  98. int crnt = 0;
  99. for (int dx = r; dx < r + k && dx < mx; dx++) {
  100. if (t1[i][dx])
  101. crnt += (1 << (dx - r));
  102. }
  103. e[i].pk(crnt);
  104. }
  105. }
  106. int an = 0;
  107. forn(i, n) {
  108. forn(j, i) {
  109. int crnt = 0;
  110. int cnt = 0;
  111. for (int l = 0; l < mx; l += k) {
  112. crnt += a[e[i][cnt]][e[j][cnt]];
  113. cnt++;
  114. }
  115. an = max(an, crnt);
  116. }
  117. }
  118. cout << an + 1;
  119. return 0;
  120. }
  121. forn(i, n) {
  122. forn(j, m) {
  123. q.insert(w[i][j]);
  124. }
  125. }
  126.  
  127. int cnt = 0;
  128. map<int, int> MyFirstMap;
  129. for (auto i : q) {
  130. MyFirstMap[i] = cnt;
  131. cnt++;
  132. }
  133. vector<vector<char> > t(n, vector<char>(q.size(), false));
  134. forn(i, n) {
  135. forn(j, m) {
  136. t[i][MyFirstMap[w[i][j]]] = true;
  137. }
  138. }
  139. int k = l[n];
  140. forn(i, 1 << k) {
  141. forn(j, 1 << k) {
  142. forn(l, k)
  143. a[i][j] += ((j & (1 << l)) > 0) * ((i & (1 << l)) > 0);
  144. }
  145. }
  146. vector<vector<int> > e(n);
  147. forn(i, n) {
  148. for (int r = 0; r < q.size(); r += k) {
  149. int crnt = 0;
  150. for (int dx = r; dx < r + k && dx < q.size(); dx++) {
  151. if (t[i][dx])
  152. crnt += (1 << (dx - r));
  153. }
  154. e[i].pk(crnt);
  155. }
  156. }
  157. int an = 0;
  158. forn(i, n) {
  159. forn(j, i) {
  160. int crnt = 0;
  161. int cnt = 0;
  162. for (int l = 0; l < q.size(); l += k) {
  163. crnt += a[e[i][cnt]][e[j][cnt]];
  164. cnt++;
  165. }
  166. an = max(an, crnt);
  167. }
  168. }
  169. cout << an + 1;
  170. return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement