排序+数据结构

将每一行(每一列)都排个序,并将原位置的在这一行(列)中的排行记录在一个数组里

注意,要将楼高度相同的元素看作一个元素

如 1 1 4 5 6 8 8,则排行是

     1 1 2 3 4 5 5

处理好后,枚举每一个十字路口,

若当前的处在的行的排行大于列的排行,则当前这个元素之后的列中元素应以行的排行开始依次递增,

若当前的处在的行的排行小于列的排行,则当前这个元素之后的行中元素应以列的排行开始依次递增,

注意,若当前的处在的行的排行等于列的排行时,则要从如上两个方面同时考虑,取最大值。

#include <bits/stdc++.h>
using namespace std;
int n,m,a[1010][1010],hh[1010][1010],ll[1010][1010];
int mh[1500],ml[1500];
struct node
{
int wh,num;
};
vector <node> h[1010],l[1010];
bool cmp(node a,node b)
{
return a.num<b.num;//以高度降序排序
}
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]);
}
}
for (int i=1;i<=n;i++)//处理行的情况
{
node t;
for (int j=1;j<=m;j++)
{
t.num=a[i][j];
t.wh=j;
h[i].push_back(t);
}
sort(h[i].begin(),h[i].end(),cmp);
int how=0;
for (int j=0;j<m;j++)
{
if (j!=0)
{
if (h[i][j-1].num==h[i][j].num)
how++;//重复的有多少个
}
hh[i][h[i][j].wh]=j+1-how;//记录排行
}
mh[i]=m-how;//最大值
}
for (int j=1;j<=m;j++)//处理列的情况
{
node t;
for (int i=1;i<=n;i++)
{
t.num=a[i][j];
t.wh=i;
l[j].push_back(t);
}
sort(l[j].begin(),l[j].end(),cmp);
int how=0;
for (int i=0;i<n;i++)
{
if (i!=0)
{
if (l[j][i-1].num==l[j][i].num)
how++;
}
ll[l[j][i].wh][j]=i+1-how;
}
ml[j]=n-how;
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
int cha;
if (hh[i][j]==ll[i][j])//如上
{
int cha1;
cha1=mh[i]-hh[i][j];
cha=ml[j]-ll[i][j];
printf("%d ",max(max(hh[i][j]+cha,mh[i]),max(ll[i][j]+cha1,ml[j])));
}
else
if (hh[i][j]>ll[i][j])
{
cha=ml[j]-ll[i][j];
printf("%d ",max(hh[i][j]+cha,mh[i]));
}
else
if (hh[i][j]<ll[i][j])
{
cha=mh[i]-hh[i][j];
printf("%d ",max(ll[i][j]+cha,ml[j]));
}
}
printf("\n");
}
}

最新文章

  1. Scrum Master 面试题 – 你必须知道的22个Scrum基础知识
  2. background-position百分比原理
  3. Android学习笔记(六)——活动的启动模式
  4. uva-465(overflow)
  5. cygwin配置git
  6. Ubuntu格式化分区时的一个小错误
  7. 关于InputStream 和String对象之间的相互转换
  8. 服务器程序源代码分析之三:gunicorn
  9. CocoaLumberjack+XcodeColor(输出带有颜色的日志)在安装过程中遇到的问题
  10. Eclipse(PHP、JAVA)的快捷键大全
  11. Blob API及问题记录
  12. springMVC简单的一些操作
  13. unity Tab键实现切换输入框功能
  14. Redis的数据结构之sorted-set
  15. vue 中给组建绑定原生事件@click.native=&quot;&quot;
  16. 【清北学堂2018-刷题冲刺】Contest 6
  17. Web的攻击技术笔记
  18. 用adb取出在手机中安装的apk
  19. 阿里云Linux服务器安装 nginx+mysql+php
  20. 使用 C++ 的 StringBuilder 提升 4350% 的性能

热门文章

  1. GOOGLE工作法(世界一速)|木深读书笔记
  2. 【题解】[CEOI2004]锯木厂选址
  3. Systemd的权威用法【译】
  4. 为Facebook messenger平台开发聊天机器人
  5. IDEA推送docker镜像到私服/利用dockerfile-maven-plugin插件在springboot中上传镜像到远程的docker服务器、远程仓库
  6. html ul li 自定义宽
  7. .NET Core使用FluentEmail发送邮件
  8. gitlab介绍
  9. Kafka单机安装
  10. 抓包工具Charles使用