Codeforces Round #545 (Div. 2)C(离散化,思维,PAIR排序)

#include<bits/stdc++.h>
using namespace std;
int a[1007][1007];
pair<int,int>p1[1007],p2[1007];
int rk1[1007][1007],rk2[1007][1007],no1[1007][1007],no2[1007][1007];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    int cnt=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            p1[j].first=a[i][j];
            p1[j].second=j;
        }
        sort(p1+1,p1+1+m);//这一行排序
        cnt=0;
        for(int j=1;j<=m;j++){
            if(j==1||p1[j].first!=p1[j-1].first)
                cnt++;//从西向东计数,将相等的点缩起来
            rk1[i][p1[j].second]=cnt;
        }
        cnt=0;
        for(int j=m;j>=1;j--){//从东向西计数
            if(j==m||p1[j].first!=p1[j+1].first)
                cnt++;
            no1[i][p1[j].second]=cnt;
        }
    }
    cnt=0;
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            p2[j].first=a[j][i];
            p2[j].second=j;
        }
        sort(p2+1,p2+1+n);//列排序
        cnt=0;
        for(int j=1;j<=n;j++){
            if(j==1||p2[j].first!=p2[j-1].first)
                cnt++;//从北向南计数
            rk2[i][p2[j].second]=cnt;
        }
        cnt=0;
        for(int j=n;j>=1;j--){
            if(j==n||p2[j].first!=p2[j+1].first)
                cnt++;//从南向北
            no2[i][p2[j].second]=cnt;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int ans=max(rk1[i][j],rk2[j][i])+max(no1[i][j],no2[j][i])-1;//西北最值加上东南最值减去自身多数的一次
            printf("%d ",ans);
        }
        printf("\n");
    }
    return 0;
}

posted @ 2019-03-11 15:39  sewage  阅读(116)  评论(0编辑  收藏  举报