【离散化处理】 Codeforces Round #545 (Div. 2) C. Skyscrapers

 Codeforces Round #545 (Div. 2) C. Skyscrapers

http://codeforces.com/contest/1138/problem/C

给你一个n*m的矩阵

问你以每一个位置作为交叉点,在第i行第j列中保持第i行和第j列中元素相对大小不变

尽量是元素变小,这样操作后第i行第j列最大的元素就是输出新矩阵中这个位置的答案

开两个矩阵,一个保存行离散化,一个保存列离散化

然后分类讨论

#include 
using namespace std;
int a[1005][1005];
int b[1005][1005],b1[1005][1005],sz_b[1005],sz_b1[1005],f1[1005],f2[1005],ans[1005][1005];
int aa[1005][1005],bb[1005][1005];
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",&a[i][j]);
            b[i][j]=a[i][j];
            b1[j][i]=a[i][j];
        }
    }


    for(int i=1;i<=n;i++)
    {
        sort(b[i]+1,b[i]+m+1);
        sz_b[i]=unique(b[i]+1,b[i]+m+1)-b[i]-1;
        for(int j=1;j<=m;j++)
        {
            aa[i][j]=lower_bound(b[i]+1,b[i]+sz_b[i]+1,a[i][j])-b[i];
        }
        f1[i]=sz_b[i];

    }
    for(int i=1;i<=m;i++)
    {
        sort(b1[i]+1,b1[i]+n+1);
        sz_b1[i]=unique(b1[i]+1,b1[i]+n+1)-b1[i]-1;
        for(int j=1;j<=n;j++)
        {
            bb[j][i]=lower_bound(b1[i]+1,b1[i]+sz_b1[i]+1,a[j][i])-b1[i];
        }
        f2[i]=sz_b1[i];
    }

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int k=aa[i][j];
            int k1=bb[i][j];
            if(k==k1) ans[i][j]=max(f1[i],f2[j]);
            else if(k

 

你可能感兴趣的:(离散化)