好长一个题。
题意:给你n*m的交叉路口上每个楼的高度,现在要你重新安排每个 楼的高度,让每行,每列的大小关系不变,对于每个交叉点,输出该行该列中最大元素的值
int h[1111][1111];
vector<int>r[1111],c[1111];
void solve()
{
int n,m;cin>>n>>m;
rpp(i,n) rpp(j,m)
{
int x;cin>>x;h[i][j]=x;
r[i].push_back(x),c[j].push_back(x);
}
rpp(i,n) sort(all(r[i])),r[i].erase(unique(r[i].begin(),r[i].end()), r[i].end());
rpp(i,m) sort(all(c[i])),c[i].erase(unique(c[i].begin(),c[i].end()), c[i].end());
rpp(i,n) rpp(j,m)
{
int x=h[i][j];
int rsmall=lower_bound(all(r[i]),x)-r[i].begin(),rbigger=r[i].end()-lower_bound(all(r[i]),x);
int csmall=lower_bound(all(c[j]),x)-c[j].begin(),cbigger=c[j].end()-lower_bound(all(c[j]),x);
cout<<max(rsmall,csmall)+max(rbigger,cbigger);
if(j==m) cout<<endl;
else cout<<" ";
}
}
signed main()
{
fast;
solve();
return 0;
}