题意:给你一个矩阵,对于每个点,把它所在一行一列分离出来,在行列各自相对顺序不改变的情况下离散化(比如 ,则离散化
),求离散化后的最大值。
分析:题目蛮长的,看明白了就是一个离散化。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1005;
int s[N][N];
int r[N][N];
int c[N][N];
int tmpr[N];
int tmpc[N];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&s[i][j]);
r[i][j]=s[i][j];
c[j][i]=s[i][j];
}
for(int i=1;i<=n;i++)
{
sort(r[i]+1,r[i]+m+1);
tmpr[i]=unique(r[i]+1,r[i]+m+1)-r[i]-1;
}
for(int i=1;i<=m;i++)
{
sort(c[i]+1,c[i]+n+1);
tmpc[i]=unique(c[i]+1,c[i]+n+1)-c[i]-1;
}
int a,b;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++ )
{
a=lower_bound(r[i],r[i]+tmpr[i],s[i][j])-r[i];
b=lower_bound(c[j],c[j]+tmpc[j],s[i][j])-c[j];
printf("%d ",max(a,b)+max(tmpr[i]-a,tmpc[j]-b));
// ans=max(行中比这个点小的个数,列中比这个点小的个数)+1
// +max(行中比这个点大的个数,列中比这个点大的个数)
}
puts("");
}
return 0;
}