https://codeforces.com/problemset/problem/1138/C
题意:
nxm条街道,每个路口有个高度已知的大厦,然后站在每个路口看,对应的两条街道的楼都可以将高度简化成1,2,3...
保证同一条街道上的大厦高度的大小关系不能改变的前提下,打印每个路口能看到的横竖街道上最高的简化过的楼层。
思路:
计算每个路口的两路排序和不同高度大厦的数量(9栋大厦可能只有2个高度),算出这个路口能看到的最高楼层。
比如横向第5,共8个;纵向第3,公7个;那最高层最小是5+(7-3) = 9
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <map>
using namespace std;
class ts
{
public:
int h;
int l;
int r;
int ls;
int rs;
public:
int get_p()
{
//printf("\nh= %d l = %d r = %d ls = %d rs = %d \n", h, l, r, ls, rs);
int temp = max(ls-l, rs-r);
int jishu = max(l,r);
return jishu+temp;
}
};
ts a[1010][1010];
int main()
{
vector<int> vec;
map<int,int> mpa;
int n,m;
while(scanf("%d %d",&n, &m)!=EOF)
{
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
scanf("%d",&a[i][j].h);
}
// east
for(int i=0; i<n; i++)
{
mpa.clear();
for(int j=0; j<m; j++)
{
mpa[a[i][j].h]=0;
}
int cnt = 1;
for(auto &itor : mpa)
{
itor.second = cnt++;
}
for(int j=0; j<m; j++)
{
a[i][j].rs = cnt-1;;
a[i][j].r = mpa[a[i][j].h];
}
}
// south
for(int j=0; j<m; j++)
{
mpa.clear();
for(int i=0; i<n; i++)
{
mpa[a[i][j].h]=0;
}
int cnt = 1;
for(auto &itor : mpa)
{
itor.second = cnt++;
//printf("第%d列 height = %d :%d\n", j, itor.first, itor.second);
}
for(int i=0; i<n; i++)
{
a[i][j].ls = cnt-1;;
a[i][j].l = mpa[a[i][j].h];
}
}
//OUTPUT
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
auto tmp = a[i][j].get_p();
if(j == 0)
printf("%d", tmp);
else
printf(" %d", tmp);
}
printf("\n");
}
}
return 0;
}