Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #pragma comment(linker, "/STACK:66777216")
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- #include <vector>
- #include <ctime>
- #include <map>
- #include <set>
- #include <string>
- #include <queue>
- #include <deque>
- #include <cassert>
- #include <cstdlib>
- #include <bitset>
- #include <algorithm>
- #include <string>
- #include <list>
- #include <fstream>
- #include <sstream>
- #include <unordered_set>
- using namespace std;
- typedef unsigned long long ull;
- typedef long long ll;
- typedef long double ld;
- #define foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
- #define forn(i, n) for (int i = 0; i < (int)n; i++)
- #define fornn(i, q, n) for (int i = q; i < (int)n; i++)
- #define mp make_pair
- #define pk push_back
- #define all(v) v.begin(), v.end()
- #define times clock() * 1.0 / CLOCKS_PER_SEC
- #define TASK "selfdual"
- const double EPS = 1e-7;
- const ll inf = (ll)2e9 + 7;
- const ll LINF = (ll)9e18 + 7;
- const ll MM = (ll)1e9 + 7;
- int solve();
- int main()
- {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
- #else
- //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
- //freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout), freopen("test.txt", "w", stderr);
- #endif
- solve();
- return 0;
- }
- int a[3000][3000];
- int l[100007];
- int solve() {
- l[1] = 0;
- fornn(i, 2, (int)1e5)
- l[i] = l[i / 2] + 1;
- l[0] = l[1] = 1;
- int n, m;
- cin >> n >> m;
- if (n == 1) {
- cout << 0;
- return 0;
- }
- vector<vector<int> > w(n, vector<int>(m));
- set<int> q;
- int mx = 0;
- forn(i, n) {
- forn(j, m) {
- cin >> w[i][j];
- mx = max(mx, w[i][j]);
- }
- }
- if (mx <= 200 && n > 40) {
- int k = (l[n] + 1) / 2;
- char t1[10007][207];
- forn(i, n) {
- forn(j, m) {
- t1[i][w[i][j]] = true;
- }
- }
- forn(i, 1 << k) {
- forn(j, 1 << k) {
- forn(l, k)
- a[i][j] += ((j & (1 << l)) > 0) * ((i & (1 << l)) > 0);
- }
- }
- vector<vector<int> > e(n);
- forn(i, n) {
- for (int r = 0; r < mx; r += k) {
- int crnt = 0;
- for (int dx = r; dx < r + k && dx < mx; dx++) {
- if (t1[i][dx])
- crnt += (1 << (dx - r));
- }
- e[i].pk(crnt);
- }
- }
- int an = 0;
- forn(i, n) {
- forn(j, i) {
- int crnt = 0;
- int cnt = 0;
- for (int l = 0; l < mx; l += k) {
- crnt += a[e[i][cnt]][e[j][cnt]];
- cnt++;
- }
- an = max(an, crnt);
- }
- }
- cout << an + 1;
- return 0;
- }
- forn(i, n) {
- forn(j, m) {
- q.insert(w[i][j]);
- }
- }
- int cnt = 0;
- map<int, int> MyFirstMap;
- for (auto i : q) {
- MyFirstMap[i] = cnt;
- cnt++;
- }
- vector<vector<char> > t(n, vector<char>(q.size(), false));
- forn(i, n) {
- forn(j, m) {
- t[i][MyFirstMap[w[i][j]]] = true;
- }
- }
- int k = l[n];
- forn(i, 1 << k) {
- forn(j, 1 << k) {
- forn(l, k)
- a[i][j] += ((j & (1 << l)) > 0) * ((i & (1 << l)) > 0);
- }
- }
- vector<vector<int> > e(n);
- forn(i, n) {
- for (int r = 0; r < q.size(); r += k) {
- int crnt = 0;
- for (int dx = r; dx < r + k && dx < q.size(); dx++) {
- if (t[i][dx])
- crnt += (1 << (dx - r));
- }
- e[i].pk(crnt);
- }
- }
- int an = 0;
- forn(i, n) {
- forn(j, i) {
- int crnt = 0;
- int cnt = 0;
- for (int l = 0; l < q.size(); l += k) {
- crnt += a[e[i][cnt]][e[j][cnt]];
- cnt++;
- }
- an = max(an, crnt);
- }
- }
- cout << an + 1;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement