小红的排列构造(dp优化)

题目描述

小红拿到了一个长度为n的数组a,她希望你构造两个排列p和q,满足对于i∈[1,n],ai∈[1,n]pi或qi二选一。你能帮帮她吗?定义排列是一个长度为n的数组,其中1到n每个元素恰好出现1次。

输入描述:第一行输入一个正整数n,代表两个数组的长度。 第二行输入n个正整数ai​。1≤n≤10^5,1≤ai≤n。

输出描述:如果无解,请输出-1。 否则第一行输出n个正整数pi,第二行输出n个正整数qi,代表小红构造的两个排列。有多解时输出任意即可。

输入

3

2 3 2

输出

2 3 1
1 3 2

输入

4
1 1 1 1
输出:-1
#include<bits/stdc++.h>
#include<iostream>
#include<vector>
using namespace std;
const long long N=1e7+5;
inline int read(){//内联函数效率更高int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48),c=getchar();}return x*f;
}
inline void print(int x)
{if(x<0)putchar('-'),x=-x;if(x>9)print(x/10);putchar(x%10+'0');return;}
int n,k=0,z=0;
vector<int> tr(N),arr(N),p1(N),p2(N);//向量比数组更加灵活与方便
int main(){cin>>n;for(int i=1;i<=n;i++){arr[i]=read();if(tr[arr[i]]==2){cout<<"-1";return 0;}++tr[arr[i]];}for(int i=1;i<=n;i++){if(tr[arr[i]]==1){p1[i]=arr[i];p2[i]=arr[i];}if(tr[arr[i]]==3){while(tr[++k]!=0);p1[i]=k;p2[i]=arr[i];}if(tr[arr[i]]==2){tr[arr[i]]=3;p1[i]=arr[i];while(tr[++z]!=0);p2[i]=z;}}	for(int i=1;i<=n;i++)print(p1[i]),putchar(32);putchar(10);for(int i=1;i<=n;i++)print(p2[i]),putchar(32);putchar(10);	return 0;
}

这个虽然通过运行但是时间和内存都耗费很大

#include<bits/stdc++.h>
#define ll long long
const ll N=1e5+5;
#define _for(i,a,b) for(int(i)=(a);(i)<(b);(i)++)
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48),ch=getchar();}return x*f;
}
void write(int x)
{if(x<0)putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');return;}
int n,k=0,z=0;
vector<int> tr(N),arr(N),p1(N),p2(N);
int main(){cin>>n;for(int i=1;i<=n;i++){arr[i]=read();if(tr[arr[i]]==2){cout<<"-1";return 0;}++tr[arr[i]];}for(int i=1;i<=n;i++){if(tr[arr[i]]==1){p1[i]=arr[i];p2[i]=arr[i];}if(tr[arr[i]]==3){while(tr[++k]!=0);p1[i]=k;p2[i]=arr[i];}if(tr[arr[i]]==2){tr[arr[i]]=3;p1[i]=arr[i];while(tr[++z]!=0);p2[i]=z;}}	for(int i=1;i<=n;i++)write(p1[i]),putchar(32);putchar(10);for(int i=1;i<=n;i++)write(p2[i]),putchar(32);putchar(10);		return 0;
}

原因如下:

第一次定义的数组范围过大,造成无用空间过多的浪费;

#define _for(i,a,b) for(int(i)=(a);(i)<(b);(i)++)类似于定义了一个模板,效率更高。

  • n 用于存储整数的数量;
  • k 和 z 用于临时存储新的整数值;
  • tr 数组记录每个整数出现的次数;
  • arr 数组存储原始整数序列;
  • p1 和 p2 数组分别存储变换后的两个序列;
  • 读取整数序列,统计每个整数出现的次数并存储在tr数组中;
  • 遍历arr数组,根据tr[arr[i]]的值决定如何填充p1p2
  • 如果某个整数出现了4次,先将其置为3次,然后分别将它放入p1和一个新的未出现过的整数放入p2
  • 如果某个整数出现了偶数次但不是4次,将其中一个放入p1,然后找一个未出现过的整数放入p2
  • 如果某个整数出现了奇数次,直接放入两个新数组;
  • 最后输出处理后的两个序列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析OceanBase v4.2 Oracle 语法兼容之 LOCK TABLE

背景 在OceanBase V4.1及之前的版本中&#xff0c;尽管已经为Oracle租户兼容了LOCK TABLE相关的语法&#xff0c;包括单表锁定操作&#xff0c;和WAIT N&#xff0c; NOWAIT 关键字。但使用时还存在一些限制。例如&#xff1a;LOCK TABLE只能针对单表进行锁定&#xff0c;并不…

URL GET +号后台接收成空格

问题&#xff1a;参数spdmwhbs001 其中包含URL特殊符号 如果用GET请求方式不做任何不处理那么浏览器自动将转为%20 请求链接为 details?spdmwhbs%20001&limitKcysType1 后台接收到的参数为 whbs 001 &#xff0c;自动将号转成空格了。 尝试解决&#xff08;失败&#…

Redis中的事务(二)

事务 事务的实现 执行事务 当一个处于事务状态的客户端向服务器发送EXEC命令时&#xff0c;这个EXEC命令将立即被服务器执行&#xff0c;服务器会遍历这个客户端的事务队列&#xff0c;执行队列中保存的所有命令&#xff0c;最后将执行命令所得的结果全部返回给客户端。 例…

STM32学习和实践笔记(17):STM32外部中断(EXTI)的整体介绍

1.外部中断介绍 1.1 EXTI简介 STM32F10x外部中断/事件控制器&#xff08;EXTI&#xff09;包含多达 20 个用于产生事件/中断请求的边沿检测器。&#xff08;事件与中断的区别&#xff0c;可参看STM32---中断与事件的区别_中断和事件的区别-CSDN博客&#xff09; 具体有哪些&a…

C语言结课实战项目_贪吃蛇小游戏

目录 最终实现效果&#xff1a; 实现基本的功能&#xff1a; 根据游戏进程解释代码&#xff1a; 游戏初始化&#xff1a; 首先进入游戏&#xff0c;我们应该将窗口名称改为 “贪吃蛇” 并将光标隐藏掉。再在中间打印游戏信息。 之后我们要把地图打印出来&#xff1a; 然后…

【Qt】设置QT标准对话框为中文字体

设置QT标准对话框为中文字体 一、问题二、解决方法1、找到Qt内置的翻译文件 qt_zh_CN.qm2、在代码中加载该文件 一、问题 在Qt中我们使用的标准对话框都是英文&#xff0c;例如下面的 字体选择对话框&#xff0c;但是实际中我们需要构建的是中文对话框。 所以我们需要使用Qt官…

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面

js自动缩放页面&#xff0c;html自动缩放页面&#xff0c;大屏自动缩放页面&#xff0c;数字看板自动缩放页面&#xff0c;大数据看板自动缩放页面 由纯JS实现 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…

【数据结构】单链表的头节点与尾节点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

玄子Share-计算机网络参考模型

玄子Share-计算机网络参考模型 分层思想 利用七层参考模型&#xff0c;便于在网络通信过程中&#xff0c;快速的分析问题&#xff0c;定位问题并解决问题 将复杂的流程分解为几个功能相对单一的子过程 整个流程更加清晰&#xff0c;复杂问题简单化 更容易发现问题并针对性的…

【Java开发指南 | 第十七篇】Java 方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 简介语法实例构造方法 简介 Java中的方法是用来执行特定任务的一组语句&#xff0c;可以重复使用。它们包含在类或对象中&#xff0c;并通过调用来执行。 举个例子&#xff0c;println() 是一个方法&#xff…

动态内存管理 柔性数组

文章目录 动态内存函数 malloc freecallocrealloc 重新开辟空间realloc 也可以第一个参数为NULL&#xff0c;则是直接开辟内存&#xff0c;类似于malloc用法 常见的动态内存错误对空指针进行解引用操作对开辟的内存越界访问对非动态开辟的内存使用free释放使用free释放动态开辟…

(四)相关性分析 学习简要笔记 #统计学 #CDA学习打卡

目录 一. 相关性分析简介 二. 相关性分析方法 1&#xff09;连续型变量vs连续型变量&#xff1a;Pearson/Spearman &#xff08;a&#xff09;Pearson &#xff08;b&#xff09;Spearman等级相关系数 2&#xff09;二分类变量&#xff08;自然&#xff09;vs连续型变量&…

macos知名的清理软件 cleanmymac和腾讯柠檬哪个好 cleanmymacx有必要买吗

MacOS是一款优秀的操作系统&#xff0c;但是随着使用时间的增加&#xff0c;它也会产生一些不必要的垃圾文件&#xff0c;占用磁盘空间和内存资源&#xff0c;影响系统的性能和稳定性。为了保持MacOS的清洁和高效&#xff0c;我们需要使用一些专业的清理软件来定期扫描和清除这…

【Golang】Gin教学-获取请求信息并返回

安装Gin初始化Gin处理所有HTTP请求获取请求的URL和Method获取请求参数根据Content-Type判断请求数据类型处理JSON数据处理表单数据处理文件返回JSON响应启动服务完整代码测试 Gin是一个用Go&#xff08;又称Golang&#xff09;编写的HTTP Web框架&#xff0c;它具有高性能和简洁…

Event loop(Message loop)

事件循环&#xff08;消息循环&#xff09; 浏览器的进程模型 进程 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 线程 …

【Linux学习】Linux权限(二)

文章目录 &#x1f680;Linux权限管理&#x1f680;修改文件的所有者&#x1f680;修改文件或目录的所属组&#x1f680;同时修改为念的拥有者与所属组&#x1f680;文件类型&#x1f680;file指令&#x1f680;目录权限&#x1f680;umask指令&#x1f680;粘滞位 &#x1f68…

网盘——私聊

在私聊这个功能实现中&#xff0c;具体步骤如下&#xff1a; 1、实现步骤&#xff1a; A、客户端A发送私聊信息请求&#xff08;发送的信息包括双方的用户名&#xff0c;聊天信息&#xff09; B、如果双方在线则直接转发给B&#xff0c;不在线则回复私聊失败&#xff0c;对方…

Sping源码(七)—ConfigurationClassPostProcessor创建流程

序言 前两篇文章介绍了invokeBeanFactoryPostProcessors的执行流程&#xff0c;和自定义实现BeanDefinitionRegistryPostProcessor类的方式方法。 这篇文章会主要介绍Spring启动加载xml时&#xff0c;ConfigurationClassPostProcessor类是如何加载到Spring中&#xff0c;并且…

【数学建模】最优旅游城市的选择问题:层次分析模型(含MATLAB代码)

层次分析法&#xff08;The analytic hierarachy process&#xff0c;简称AHP&#xff09;是一种常用的决策分析方法&#xff0c;其基本思路是将复杂问题分解为多个组成部分&#xff0c;然后对这些部分进行逐一评估和比较&#xff0c;最后得出最优解决方案。&#xff08;例如&a…

JVM知识点总结二

参考文章&#xff1a;【Java面试题汇总】JVM篇&#xff08;2023版&#xff09;_jvm面试题2023-CSDN博客 1、说说你了解的JVM内存模型&#xff1a; JVM由三部分组成&#xff1a;类加载子系统、运行时数据区、执行引擎 JVM内存模型&#xff1a; 内存模型里的运行时数据区&#…