地址:http://acm.uestc.edu.cn/#/problem/show/1338

思路:

郭大侠与英雄学院

Time Limit: 6000/2000MS (Java/Others)     Memory Limit: 225535/225535KB (Java/Others)
Submit Status

大部分的人类,在这个时代里都拥有名为“个性”的力量,但有力量之人却不一定都属於正义的一方。只要邪恶出现的地方,必定会有英雄挺身而出拯救众人。一名天生没有力量的少年——郭大侠从小就憧憬一位顶尖英雄,而他的梦想就是成为伟大的英雄,可是,没有力量的他能实现自己的梦想吗?虽然困难重重,少年却依旧不放弃,朝著自己的目标勇往前进!

……

尽管郭大侠没有个性,但是郭大侠的确是一个拥有超强意志的“英雄”。

所谓的英雄,便是能够在大家无动于衷的时候,挺身而出!

今天,郭大侠出现了!

郭大侠面对一个n∗mn∗m的矩阵,每个矩阵的每一个位置都有一个怪物。

郭大侠为了更好的击败他们,他的第一个任务就是分析怪物的战斗力。

为了简化自己分析时候的计算,郭大侠需要得到另外一个n∗mn∗m的矩阵。

这个矩阵满足以下要求:

1.这个新矩阵每一行,每一列中的大小关系和原矩阵一样。

2.这个新矩阵的最小值应该尽量小;保证最小值最小的情况下,使得第二小的值尽量小……使得最大值尽量小。

现在郭大侠特别忙,请你帮助郭大侠输出这个矩阵吧!

Input

第一行n,m表示矩阵的大小

接下来n行,每行m个整数,表示怪物的战斗力

保证:

1<=n∗m<=10000001<=n∗m<=1000000

怪物的战斗力是int范围内的数。

Output

输出一个新的矩阵~

新的矩阵中,最小的数至少为1哦。

Sample input and output

Sample Input Sample Output
3 3
1 2 3
4 5 6
7 8 9
1 2 3
2 3 4
3 4 5
2 2
1 4
3 2
1 2
2 1

思路:

最基本的思路是对所有数排个序,然后一个一个填就好了,然而因为同行同列中有相同的数就麻烦了。

所以每次把同行同列中的的所有相同的的数拖进同一个并查集,用并查集来维护相同数应该放的值

就这样一层一层的合并,直到填完。。

不过输出的时候就要用并查集里记录的那个答案来输出。。。(话说这题想了我一万年,,,,

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <cstdlib>
#include <string> #define PI acos((double)-1)
#define E exp(double(1))
const int MAX=1e6+;
using namespace std;
struct node
{
int v,x,y;
}a[MAX];
int ans[MAX],xmax[MAX],ymax[MAX],hx[MAX],hy[MAX];
int root[MAX];
int fd(int x)
{
return x!=root[x]?root[x]=fd(root[x]):x;
}
void join(int x,int y)
{
int a=fd(x),b=fd(y);
if(a!=b)root[a]=b;
}
bool cmp(struct node c,struct node b)
{
return c.v<b.v;
}
int main (void)
{
int n,m;
cin>>n>>m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
scanf("%d",&a[(i-)*m+j].v);
a[(i-)*m+j].x=i;a[(i-)*m+j].y=j;
}
sort(a+,a+n*m+,cmp);
memset(xmax,,sizeof(xmax));
memset(ymax,,sizeof(ymax));//全部设为0,
memset(ans,,sizeof(ans));
int same=;//记录相同元素
for(int i=;i<=n*m;i++)
root[i]=i;
for(int i=;i<=n*m;i++)
{
if(i!=n*m && a[i].v==a[i+].v)
continue;
for(int j=same;j<=i;j++)
{
hx[a[j].x]=hy[a[j].y]=(a[j].x-)*m+a[j].y;
}
for(int j=same;j<=i;j++)
{
join(hx[a[j].x],(a[j].x-)*m+a[j].y);
join(hy[a[j].y],(a[j].x-)*m+a[j].y);
}
for(int j=same;j<=i;j++)
{
int x = a[j].x,y=a[j].y;
int rt = fd((a[j].x-)*m+a[j].y);
ans[rt]=max(ans[rt],max(xmax[x],ymax[y])+);
}
for(int j=same;j<=i;j++)
{
int x = a[j].x,y=a[j].y;
xmax[x]=max(xmax[x],ans[fd((a[j].x-)*m+a[j].y)]);
ymax[y]=max(ymax[y],ans[fd((a[j].x-)*m+a[j].y)]);
}
same=i+;
}
for(int i=;i<=n*m;i++)
{
if(i%m==)
printf("%d \n",ans[fd(i)]);
else
printf("%d ",ans[fd(i)]);
}
return ;
}

cdoj1338郭大侠与英雄学院的更多相关文章

  1. cdoj 1334 郭大侠与Rabi-Ribi Label:贪心+数据结构

    郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 最近 ...

  2. cdoj 1342 郭大侠与甲铁城 树状数组+离线

    郭大侠与甲铁城 Time Limit: 1500/800MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  3. cdoj 1334 郭大侠与Rabi-Ribi 贪心+数据结构

    郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su ...

  4. CDOJ 1284 苦恼的郭大侠 map启发式合并

    苦恼的郭大侠 题目连接: http://acm.uestc.edu.cn/#/problem/show/1284 Description 花开雷霆崖,血染伊吕波. 公元1772年. 郭大侠终于照着天行 ...

  5. cdoj1342郭大侠与甲铁城

    地址:http://acm.uestc.edu.cn/#/problem/show/1342 题目: 郭大侠与甲铁城 Time Limit: 1500/800MS (Java/Others)     ...

  6. cdoj1339郭大侠与线上游戏

    地址:http://acm.uestc.edu.cn/#/problem/show/1339 题目: 郭大侠与线上游戏 Time Limit: 6000/2000MS (Java/Others)    ...

  7. cdoj1337郭大侠与阴阳家

    地址:http://acm.uestc.edu.cn/#/problem/show/1337 思路: 郭大侠与阴阳家 Time Limit: 3000/4000MS (Java/Others)     ...

  8. cdoj1334郭大侠与Rabi-Ribi

    地址:http://acm.uestc.edu.cn/#/problem/show/1334 题目: 郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Other ...

  9. 郭大侠与Rabi-Ribi (优先队列)

    最近郭大侠迷上了玩Rabi-Ribi这个游戏. Rabi-Ribi呢,是一个打兔子的动作冒险游戏,萌萌哒的兔子在地上跑来跑去,好萌好萌呀~ 这个游戏是这样玩的,郭大侠作为一个主角,拿着一个小锤子,他的 ...

随机推荐

  1. C语言 百炼成钢25

    /* 题目61:编写一个名为removestring的函数,该函数用于从一个字符串中删除一定量的字符. 该函数接受三个参数: 第1参数代表源字符串 第2参数代表需要删除字符的起始位置(位置从0开始) ...

  2. Django - 安装wagtail

    感觉这个CMS系统不错,试用了一下,记录过程: 1. 安装Virtualenv mkdir wagtail virtualenv --no-site-packages --python=3.5 wag ...

  3. Ubuntu14.04编译Android5.1.1源码

    1.Ubuntu环境配置 硬盘:120G 内存:4G 注:配置很重要,直接影响能否编译成功. 2.安装JDK sudo apt-get update sudo apt-get install open ...

  4. bzoj 1415(概率dp和bfs预处理)

    感觉挺经典的一道题目. 先用 bfs 预处理下一步走到的位置.因为每一步走法都是固定的,所以可以用dp的方法来做. 1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  M ...

  5. 【NOI2015】品酒大会[后缀数组]

    #131. [NOI2015]品酒大会 统计 描述 提交 自定义测试 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项, ...

  6. iOS 断当前时间是否在一天的某个时间段内。

    应用中设置一般会存在这样的设置,如夜间勿扰模式,从8:00-23:00,此时如何判断当前时间是否在该时间段内.难点主要在于如何用NSDate生成一个8:00的时间和23:00的时间,然后用当前的时间跟 ...

  7. log4j中将SocketAppender将日志内容发送到远程服务器

    1.服务端配置 1)服务端配置文件log4j-server.properties #Define a narrow log category. A category like debug will p ...

  8. Java获取任意时间、时间字符串

    /* * 获取时间字符串*/public String getCurrentTime() { SimpleDateFormat sdf = new SimpleDateFormat("yyy ...

  9. iOS 数组containsObject:方法

    今年上半年打算巩固一下基础知识,将工作和学习中遇到的疑惑尽量搞清楚原理.作为一个菜鸟级别的程序员,我深深的体会到算法和基础的重要性,如果说算法是内功,那么基础就是下盘,只有下盘稳住了,上面才不会轻易倒 ...

  10. 模块 - random/string/os/sys/shutil/zipfile/tarfile

    random 模块 方法: >>> random.randint(1,3) #会包含 1 2 3 3 >>> random.randrange(1,3) #会包含 ...