- #include<bits/stdc++.h>
- using namespace std;
- #define re register
- inline int read()
- {
- int x = 0,f = 1;
- char ch;
- do
- {
- ch = getchar();
- if(ch == '-') f = -1;
- }while(ch <'0'||ch> '9');
- do
- {
- x = (x<<3) + (x<<1) + ch - '0';
- ch = getchar();
- }while(ch>='0' && ch <='9');
- return f*x;
- }
- const int MAXN = 4e5 + 10;
- int n;
- int a[MAXN];
- int b[MAXN],sum;
- map<int,int>vis;
- int tot;
- int ansx,ansy;
- pair<int,int>c[MAXN];
- int M[MAXN];
- int res;
- int main()
- {
- n = read();
- for(int i=1;i<=n;i++) a[i] = read();
- sort(a+1,a+n+1);
- for(int i=1;i<=n;i++)
- {
- if(a[i]!=a[i-1]) b[i] = ++sum;
- else b[i] = sum;
- vis[b[i]] = a[i];
- }
- for(int i=1;i<=sum;i++) c[i].second = i;
- for(int i=1;i<=n;i++) c[b[i]].first++;
- sort(c+1,c+sum+1);tot = n;
- for(int i=n;i>=1;i--)
- {
- for(int j=sum;j&&c[j].first>i;j--)
- {
- c[j].first--;
- tot--;
- }
- int p = tot / i;
- if(p <i) continue;
- if(res <p * i)
- {
- res = p * i;
- ansx = i,ansy = p;
- }
- }
- for(int i=1;i<=sum;i++)
- {
- c[i].first = 0;c[i].second = i;
- }
- for(int i=1;i<=n;i++) c[b[i]].first++;
- cout << res << endl << ansx << " " <<ansy << endl;
- sort(c+1,c+sum+1);
- for(int i=sum;i>=1;i--)
- {
- if(c[i].first>=ansx) c[i].first = ansx;
- else break;
- }
- int p = sum;
- for(int i=1;i<=ansy;i++)
- {
- for(int j=1;j<=ansx;j++)
- {
- if(c[p].first==0) p--;
- M[(j-1)*ansy+(i+j)%ansy+1] = vis[c[p].second];
- c[p].first--;
- }
- }
- for(int i=1;i<=res;i++)
- {
- cout << M[i] << " ";
- if(i%ansy==0) cout << endl;
- }
- }
来源: http://www.bubuko.com/infodetail-3334279.html