hdu1338郭大侠与英雄学院

地址: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

思路:

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

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

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

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

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cmath>
 5 #include <cstring>
 6 #include <queue>
 7 #include <stack>
 8 #include <map>
 9 #include <vector>
10 #include <cstdlib>
11 #include <string>
12
13 #define PI acos((double)-1)
14 #define E exp(double(1))
15 const int MAX=1e6+10;
16 using namespace std;
17 struct node
18 {
19     int v,x,y;
20 }a[MAX];
21 int ans[MAX],xmax[MAX],ymax[MAX],hx[MAX],hy[MAX];
22 int root[MAX];
23 int fd(int x)
24 {
25     return x!=root[x]?root[x]=fd(root[x]):x;
26 }
27 void join(int x,int y)
28 {
29     int a=fd(x),b=fd(y);
30     if(a!=b)root[a]=b;
31 }
32 bool cmp(struct node c,struct node b)
33 {
34     return c.v<b.v;
35 }
36 int main (void)
37 {
38     int n,m;
39     cin>>n>>m;
40     for(int i=1;i<=n;i++)
41         for(int j=1;j<=m;j++)
42         {
43             scanf("%d",&a[(i-1)*m+j].v);
44             a[(i-1)*m+j].x=i;a[(i-1)*m+j].y=j;
45         }
46     sort(a+1,a+n*m+1,cmp);
47     memset(xmax,0,sizeof(xmax));
48     memset(ymax,0,sizeof(ymax));//全部设为0,
49     memset(ans,0,sizeof(ans));
50     int same=1;//记录相同元素
51     for(int i=1;i<=n*m;i++)
52         root[i]=i;
53     for(int i=1;i<=n*m;i++)
54     {
55         if(i!=n*m && a[i].v==a[i+1].v)
56             continue;
57         for(int j=same;j<=i;j++)
58         {
59             hx[a[j].x]=hy[a[j].y]=(a[j].x-1)*m+a[j].y;
60         }
61         for(int j=same;j<=i;j++)
62         {
63             join(hx[a[j].x],(a[j].x-1)*m+a[j].y);
64             join(hy[a[j].y],(a[j].x-1)*m+a[j].y);
65         }
66         for(int j=same;j<=i;j++)
67         {
68             int x = a[j].x,y=a[j].y;
69             int rt = fd((a[j].x-1)*m+a[j].y);
70             ans[rt]=max(ans[rt],max(xmax[x],ymax[y])+1);
71         }
72         for(int j=same;j<=i;j++)
73         {
74             int x = a[j].x,y=a[j].y;
75             xmax[x]=max(xmax[x],ans[fd((a[j].x-1)*m+a[j].y)]);
76             ymax[y]=max(ymax[y],ans[fd((a[j].x-1)*m+a[j].y)]);
77         }
78         same=i+1;
79     }
80     for(int i=1;i<=n*m;i++)
81     {
82         if(i%m==0)
83             printf("%d \n",ans[fd(i)]);
84         else
85             printf("%d ",ans[fd(i)]);
86     }
87     return 0;
88 }

时间: 2024-11-07 12:57:39

hdu1338郭大侠与英雄学院的相关文章

CDOJ 1338 郭大侠与英雄学院 (并查集) - xgtao -

郭大侠与英雄学院 题意 给出一个矩阵,然后求最小矩阵,最小矩阵就是数字可以变小但是相对大小是不能改变的. 题解 1.分析最基本的思路,假设每个数字都不同,就把记录数字的位置和权值,再把每个数字根据权值从小到大排一次序,这个位置就为max(这一行的最大值,这一列的最大值)+1. 2.但是出现了同一行同一列相同数字怎么办呢?就用并查集把同行同列的相同的数都给用一个id表示出来,再找出每一相同的数各自的每一行每一列综合起来的最大值maxi+1,最后用maxi+1来更新每一相同的数各自的每一行每一列的最

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

郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 最近郭大侠迷上了玩Rabi-Ribi这个游戏. Rabi-Ribi呢,是一个打兔子的动作冒险游戏,萌萌哒的兔子在地上跑来跑去,好萌好萌呀~ 这个游戏是这样玩的,郭大侠作为一个主角,拿着一个小锤子,他的目标是敲晕兔子,然后最后把这些敲晕的兔子都带回家. 当然咯,郭大侠想带回的兔

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

最近郭大侠迷上了玩Rabi-Ribi这个游戏. Rabi-Ribi呢,是一个打兔子的动作冒险游戏,萌萌哒的兔子在地上跑来跑去,好萌好萌呀~ 这个游戏是这样玩的,郭大侠作为一个主角,拿着一个小锤子,他的目标是敲晕兔子,然后最后把这些敲晕的兔子都带回家. 当然咯,郭大侠想带回的兔子的总价值最高~ 但是,兔子实在是太多了,郭大侠的锤子每一秒钟只能敲晕一只兔子,而且每一只兔子只会在地面上逗留a[i]秒,在a[i]秒之后,这一只兔子就会跑回自己的小窝里面. 所以郭大侠面临一些抉择,希望你能帮助他. Inp

CDOJ 1335 郭大侠与“有何贵干?” (线段树&amp;扫描线) - xgtao -

郭大侠与“有何贵干?” 题意 题目给出n(<=100000)个长方体,给的是左下角和右上角的坐标x,y(1<=x,y<=1000000000),z(1<=z<=3),求刚好覆盖k次的体积,答案保证在long long 之内 题解 1.根据数据范围首先要想到要离散化. 2.求覆盖的面积或者体积会想到线段树维护扫描线,求体积难道要用二维线段树?这一道题是可以不的,因为1<=z<=3所以可以把体积拆开当做面积来算,当1<=z<=2就是求前面覆盖K次的面积,当

hdu1337郭大侠与阴阳家

地址:http://acm.uestc.edu.cn/#/problem/show/1337 思路: 郭大侠与阴阳家 Time Limit: 3000/4000MS (Java/Others)     Memory Limit: 262144/262144KB (Java/Others) Submit Status “污秽”是自异世界“祸野”现身,危害人世的怪物.而“阴阳师”长年以来则与污秽战斗至今. 国中生少年·郭大侠曾以成为能祓除所有污秽的最强阴阳师为目标,但自从遭遇了“雏月之悲剧”后,他便

hdu1342郭大侠与甲铁城

地址:http://acm.uestc.edu.cn/#/problem/show/1342 题目: 郭大侠与甲铁城 Time Limit: 1500/800MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 全世界被产业革命的波澜推动,自近世变迁至近代之时,不死的怪物突然出现.被钢铁的皮膜包覆,只要心脏不被破坏就不会消灭,被它啃咬的人似乎也会在死过一次之后复生,并开始袭击人类.之后被称为卡巴内

hdu1339郭大侠与线上游戏

地址:http://acm.uestc.edu.cn/#/problem/show/1339 题目: 郭大侠与线上游戏 Time Limit: 6000/2000MS (Java/Others)     Memory Limit: 125535/65535KB (Java/Others) Submit Status 曾在网络游戏告白,但对方是假冒女生的人妖,而对此有阴影的郭大侠,坚持把游戏和现实分得清清楚楚.有一天竟被网络游戏中的女玩家告白了,虽然在游戏中接受了亚子的表白而结婚,但仍然不敢确信亚

hdu1334郭大侠与Rabi-Ribi

地址:http://acm.uestc.edu.cn/#/problem/show/1334 题目: 郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 最近郭大侠迷上了玩Rabi-Ribi这个游戏. Rabi-Ribi呢,是一个打兔子的动作冒险游戏,萌萌哒的兔子在地上跑来跑去,好萌好萌呀~ 这个游戏是这样玩的,郭大侠作为一个

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

郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 最近郭大侠迷上了玩Rabi-Ribi这个游戏. Rabi-Ribi呢,是一个打兔子的动作冒险游戏,萌萌哒的兔子在地上跑来跑去,好萌好萌呀~ 这个游戏是这样玩的,郭大侠作为一个主角,拿着一个小锤子,他的目标是敲晕兔子,然后最后把这些敲晕的兔子都带回家. 当然咯,郭大侠想带回的兔子的总价值最高~ 但是,兔子