站外求调
  • 板块学术版
  • 楼主xiaobiru7302_1
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/18 13:56
  • 上次更新2024/8/18 14:44:57
查看原帖
站外求调
975426
xiaobiru7302_1楼主2024/8/18 13:56

题目:

[题目描述]

要过年了,大家开始对对联,即一个人写出上联,另一个人来对下联。现在给定一个长度为 nn 的上联,为了方便读入,上联中的每个字都用一个正整数代替。
你需要为这个上联写一个下联,要求如下:

  1. 下联必须都是正整数
  2. 下联中的每一个正整数都不能在上联出现过
  3. 上联中的第 ?? 个正整数和下联中的第 ?? 个正整数对应。你可以任意指定对应
    关系,但是对应关系必须统一且唯一。例如若你规定上联中的正整数 33 对应下联中的正整数 11,那么上联中的另一个非 33 的数就不能对应正整数 11,且上联中的所有 33 都必须对应 11。
    由于你可以任意指定对应关系,所以可能的下联有多种,你需要输出字典序最小的一种。

[输入格式]

第一行输入一个正整数 nn,表示数字的个数。接下来一行包含 nn 个整数,分别表示每一个正整数。

[输出格式]

输出 nn 个整数,表示下联。

[样例 11 输入]

6 3 3 4 2 4 7

[样例 11 输出]

1 1 5 6 5 8

[样例 11 说明]

令 33 对应 11,44 对应 55,22 对应 66,77 对应 88,则下联为 [1,1,5,6,5,8][1,1,5,6,5,8]。此为字典序最小的对联,若令 33 对应 99,则下联为 [9,9,5,6,5,8][9,9,5,6,5,8],也是一种合法的下联,但是不是题目所求的字典序最小的下联。

[样例 22 输入]

3 1 2 3

[样例 22 输出]

4 5 6

[样例 33 输入]

8 11 1 2 11 1 5 6 7 8

[样例 33 输出]

3 4 8 3 4 9 10 12

[数据范围]

对于 2020% 的数据,有 11 ≤\le nn,aia_i ≤\le 10001000
对于 4040% 的数据,有 11 ≤\le nn ≤\le 100000100000,11 ≤\le aia_i ≤\le 10001000
对于 6060% 的数据,有 11 ≤\le nn,aia_i ≤\le 100000100000
对于另外 2020% 的数据,有 11 ≤\le nn ≤\le 10001000,11 ≤\le aia_i ≤\le 10910^9
对于 100100% 的数据,有 11 ≤\le nn ≤\le 100000100000,11 ≤\le ???_? ≤\le 10910^9

代码(60pts60pts)

#include <bits/stdc++.h>
using namespace std;
const int N=1e8;
bool u[N];
int us[N];
int l[100001];
int n,nu;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++){scanf("%d",&l[i]);u[l[i]]=1;}
	for(int i=1;i<=n;i++)
	{
		if(us[l[i]]) continue;
		while(u[++nu]);
		us[l[i]]=nu;
	}
	for(int i=1;i<=n;i++) printf("%d ",us[l[i]]);
}
2024/8/18 13:56
加载中...