Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX(a,b) (a>b?a:b)
- #define MIN(a,b) (a<b?a:b)
- #define UP upper_bound
- #define LB lower_bound
- #define LL long long
- #define Pi 3.14159265358
- #define si size()
- #define en end()
- #define be begin()
- #define fi first
- #define se second
- #define pb push_back
- #define mp make_pair
- #define ii set<int>::iterator
- #define Tree int ind, int L, int R
- #define Left 2*ind,L,(L+R)/2
- #define Right 2*ind+1,(L+R)/2+1,R
- using namespace std;
- int max2[1000001];
- int ind1[1000001];
- int ind2[1000001];
- vector < pair < int , int > > v;
- vector < vector < int > > a, MAS1, MAS2, f1, f2, fix, Cur2, v1;
- int n, m, k, i, j, res, X, t;
- main(){
- //freopen("2line.in","r",stdin);
- //freopen("2line.out","w",stdout);
- cin>>t;
- while(t--)
- {
- scanf("%d%d",&n,&m);
- res=0;
- a.clear();
- MAS1.clear();
- MAS2.clear();
- f1.clear();
- f2.clear();
- fix.clear();
- Cur2.clear();
- v1.clear();
- f1.resize(n+5);
- f2.resize(m+5);
- fix.resize(m+5);
- Cur2.resize(n+5);
- a.resize(n+5);
- MAS2.resize(n+5);
- MAS1.resize(n+5);
- v1.resize(n+5);
- for(i=1;i<=n;i++)
- {
- a[i].resize(m+5);
- MAS2[i].resize(m+5);
- MAS1[i].resize(m+5);
- for(j=1;j<=m;j++)
- {
- scanf("%d",&a[i][j]);
- max2[a[i][j]]=0;
- ind2[a[i][j]]=0;
- ind1[a[i][j]]=0;
- }
- }
- // if()
- // for(i=1;i<=m;i++)MAS1[i].resize(n+5);
- for(i=1;i<=n;i++)
- {
- v.clear();
- for(j=1;j<=m;j++)
- v.pb(mp(a[i][j],j));
- X=0;
- sort(v.be,v.en);
- for(j=0;j<m;j++)
- {
- if(j==0 || v[j].fi!=v[j-1].fi)X++;
- MAS1[i][v[j].se]=X;
- }//cout<<"tes"; system("pause");
- Cur2[i].resize(X+10);
- f1[i].resize(X+10);
- X=0;
- for(j=0;j<m;j++)
- {
- if(j==0 || v[j].fi!=v[j-1].fi)X++;
- Cur2[i][X]=v[j].fi;
- }
- }
- for(i=1;i<=m;i++)
- {
- v.clear();
- for(j=1;j<=n;j++)
- v.pb(mp(a[j][i],j));
- X=0;
- sort(v.be,v.en);
- for(j=0;j<n;j++)
- {
- if(j==0 || v[j].fi!=v[j-1].fi)X++;
- //cout<<"teee "<<v[j].se<<" "<<i<<endl;;system("pause");
- MAS2[v[j].se][i]=X;
- }
- f2[i].resize(X+10);
- fix[i].resize(X+10);
- }
- for(i=1;i<=n;i++)
- for(j=1;j<=m;j++)
- {
- if(!f1[i][MAS1[i][j]])
- v1[i].pb(MAS1[i][j]);
- f1[i][MAS1[i][j]]++;
- f2[j][MAS2[i][j]]++;
- if(max2[a[i][j]]<f2[j][MAS2[i][j]])
- max2[a[i][j]]=f2[j][MAS2[i][j]];
- }
- for(i=1;i<=n;i++)
- for(j=1;j<=m;j++)
- if(max2[a[i][j]]==f2[j][MAS2[i][j]] && !fix[j][MAS2[i][j]])
- ind2[a[i][j]]++, ind1[a[i][j]]++, fix[j][MAS2[i][j]]=1;
- for(i=1;i<=n;i++)
- {
- for(j=1;j<=m;j++)
- {
- res=max(res,f1[i][MAS1[i][j]]+f2[j][MAS2[i][j]]-1);
- if(max2[a[i][j]]==f2[j][MAS2[i][j]])
- ind2[a[i][j]]--;
- }
- for(j=0;j<v1[i].si;j++)
- if(ind2[Cur2[i][v1[i][j]]]>0)
- res=max(res,f1[i][v1[i][j]]+max2[Cur2[i][v1[i][j]]]);
- for(j=1;j<=m;j++)
- if(f2[j][MAS2[i][j]]==max2[a[i][j]])
- ind2[a[i][j]]=ind1[a[i][j]];
- }
- cout<<res<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement