AtCoder题解——Beginner Contest 178——F - Contrast_given are two sequences a and b, both of lengt-程序员宅基地

技术标签: F题  # AtCoder题解  AtCoder题解  ABC178  Contrast  OJ题解  

题目相关

题目链接

AtCoder Beginner Contest 178 F 题,https://atcoder.jp/contests/abc178/tasks/abc178_f

Problem Statement

Given are two sequences A and B, both of length N. A and B are each sorted in the ascending order. Check if it is possible to reorder the terms of B so that for each i (1 ≤ i ≤ N) Ai≠Bi holds, and if it is possible, output any of the reorderings that achieve it.

Input

Input is given from Standard Input in the following format:

N
A1 A2 ⋯ AN
B1 B2 ⋯ BN

Output

If there exist no reorderings that satisfy the condition, print No.

If there exists a reordering that satisfies the condition, print Yes on the first line. After that, print a reordering of B on the second line, separating terms with a whitespace.

If there are multiple reorderings that satisfy the condition, you can print any of them.

Samples1

Sample Input 1

6
1 1 1 2 2 3
1 1 1 2 2 3

Sample Output 1

Yes
2 2 3 1 1 1

Samples2

Sample Input 2

3
1 1 2
1 1 3

Sample Output 2

No

Samples3

Sample Input 3

4
1 1 2 3
1 2 3 3

Sample Output 3

Yes
3 3 1 2

Constraints

  • 1 ≤ N ≤ 2×10^5
  • 1 ≤ Ai, Bi ≤ N
  • A and B are each sorted in the ascending order.
  • All values in input are integers.

题解报告

题目翻译

给定两个升序序列 A 和 B,长度都是 N。请检查是否存在这样的可能性,将序列 B 重新排列,排列好的新序列满足:对于每一个 i (1 ≤ i ≤ N),而 Ai≠Bi。如果可能,请输出重新排列的最长序列 B,如果有多种可能,只需要输出其中的一种。

题目分析

题目要求我们将序列 B 重排,因此最简单的方法就是将序列 B 倒序排列。为什么倒序呢?很简单啊,因为 STL 中的 algorithm 中提供了倒序函数(reverse)。

这样序列 A 为升序,序列 B 为降序。那么在序列 A 和 B 之间可能存在一段 [l, r] 区间,使得 A_{j}=B_{j}=c \ where\ {l \leq j \leq r}。这样,[l, r] 这个区间序列 A 和 B 的数据是相同的。我们将序列 B 的 [l, r] 区间的数据和其他区间数值不为 c (a_{i}\neq c \ and \ b_{i}\neq c \ and \ l\leqslant r)的尽可能多的数据进行对换。等对换完成,如果 l\leqslant r,说明长度不够,无解。否则打印出数列 B。

样例数据分析

样例 1

根据样例数据,我们知道序列 A 为 {1, 1, 1, 2, 2, 3},序列 B 为 {1, 1, 1, 2, 2, 3}。这样序列 B 变为 {3, 2, 2, 1, 1, 1}。

遍历序列 A 和 B,没有重合的数据。因此最终结果就是新的序列 B,也就是 {3, 2, 2, 1, 1, 1}。

样例 2

根据样例数据,我们知道序列 A 为 {1, 1, 2},序列 B 为 {1, 1, 3}。这样序列 B 变为 {3, 1, 1}。

遍历数列 A 和 B,重合的位置为 [1, 1],也就是 l=1,r=1,并记录下这个重复的数据 c=1。下面我们再次遍历数列 A 和 B。

第一个数据 a[0]=1,b[0]=3。由于 a[0]==c==1,因此无法交换位置。如果我们交换 b[0] 和 b[1],因为 b[1]=1,交换后和 a[0] 的数值一样,就不符合题意。

第二个数据 a[1]=1,b[1]=1。由于 a[1]==b[1]==c==1,因此无法交换位置。

第三个数据 a[1]=2,b[1]=1。由于 b[1]==c==1,因此无法交换位置。

遍历序列 A 和 B 后,发现 l=1,r=1,也就是 l\leqslant r,说明没法交换。因此输出 No。

样例 3

根据样例数据,我们知道序列 A 为 {1, 1, 2, 3},序列 B 为 {1, 2, 3, 3}。这样序列 B 变为 {3, 3, 2, 1}。

遍历数列 A 和 B,重合的位置为 [2, 2],也就是 l=2,r=2,并记录下这个重复的数据 c=2。下面我们再次遍历数列 A 和 B。

第一个数据 a[0]=1,b[0]=3。由于 a[0]!=c 同时 b[0]!=c 同时 l\leqslant r(说明有数据可以交换),因此我们将 b[0] 和 b[2] 进行交换,交换后的序列 B 变为 {2, 3, 3, 1},l 变成 3。

第二个数据 a[1]=1,b[1]=3。由于 a[0]!=c 同时 b[0]!=c 当时 l>r(说明没有数据可以交换)。

第三个数据 a[2]=2,b[2]=3。由于 a[0]!=c 同时 b[0]!=c 当时 l>r(说明没有数据可以交换)。

第四个数据 a[3]=3,b[3]=1。由于 a[0]!=c 同时 b[0]!=c 当时 l>r(说明没有数据可以交换)。

遍历结束后,l>r。说明新的序列 B {2, 3, 3, 1} 就是我们要找的序列。

AC 参考代码

//https://atcoder.jp/contests/abc178/tasks/abc178_f
#include <bits/stdc++.h>

using namespace std;

const int MAXN=2e5+4;
long long a[MAXN];
long long b[MAXN];

int main() {
    int n;
    cin>>n;
    for (int i=0; i<n; i++) {
        cin>>a[i];
    }
    for (int i=0; i<n; i++) {
        cin>>b[i];
    }

    reverse(b, b+n);

#if 0
    cout<<"\n";
    for (int i=0; i<n; i++) {
        cout<<a[i]<<" ";
    }
    cout<<"\n";
    for (int i=0; i<n; i++) {
        cout<<b[i]<<" ";
    }
    cout<<"\n";
#endif

    //寻找重合的区间
    int c=-1;
    int l=n;
    int r=-1;
    for (int i=0; i<n; i++) {
        if (-1==c && a[i]==b[i]) {
            //第一次出现相等
            c=a[i];
            l=i;
            r=i;
        } else if (-1!=c && a[i]==b[i]) {
            //最后一次出现相等
            r=i;
        }
    }
    //cout<<l<<" "<<r<<"\n";

    //交换数据
    for (int i=0; i<n; i++) {
        if (c!=a[i] && c!=b[i] && l<=r) {
            swap(b[i], b[l]);
            l++;
        }
    }

    if (l<=r) {
        cout<<"No\n";
    } else {
        cout<<"Yes\n";
        for (int i=0; i<n; i++) {
            cout<<b[i]<<" ";
        }
    }

    return 0;
}

细节

第一次出现 a[i]==b[i] 的时候,要将 l 和 r 都记录下来。这里掉坑了。考虑测试数据 2。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/justidle/article/details/108604007

智能推荐

三.ffmpeg 集成av1_ffmpeg av1-程序员宅基地

文章浏览阅读8.3k次,点赞2次,收藏5次。copy from zhujiamin一、介绍FFmpeg4.2支持AV1、AVS2等视频编码格式,但本身并不包含解码器,需要自己集成。集成的编解码器要避开GPL开源协议(–enable-gpl),因此不能用x264、AVS2等编解码器我在研究FFmpeg升级时,寻找能提升多媒体系统表现力的新特性,发现FFmpeg支持的基于BSD协议的dav1d解码器比较有价值,能大幅度提高AV1软解码性能,没有代码开源的风险,并且能持续迭代更新AV1是由AOM(Alliance for Open Media,开_ffmpeg av1

Anaconda安装Python与tensorflow_source activate py36-程序员宅基地

文章浏览阅读693次。众所周知Python常用的版本有2.x和3.x,常常会引起版本问题。由于我在Linux系统中已经安装有Python3.x和对应的TensorFlow,现在遇到需要跑在Python2.x下的TensorFlow工程时,就很麻烦,因此可以用Anaconda来建立一个独立的小环境来另外安装Python2.x及其对应的TensorFlow来跑这个工程。AnacondaAnaconda(官网)是什么..._source activate py36

学习3D引擎架构技术概述_二三维引擎-程序员宅基地

文章浏览阅读8.5k次,点赞9次,收藏44次。 近期对3D引擎的架构设计做了一个梳理总结,现在开发游戏都离不开引擎,这些引擎包括Unity引擎,虚幻引擎,Cocos2dx引擎,自研引擎等等。很多开发者只会利用他们写逻辑,遇到优化问题就束手无策了,遇到Shader编程以及优化就感到头疼,长此以往对自己技术提升非常不利的。要改变现有的状态,就必须要系统的学习相关3D引擎技术,这样才能在使用引擎开发产品时得心应手。本篇博客从两方面给读者做..._二三维引擎

Aidlux实现canny边缘检测。-程序员宅基地

文章浏览阅读50次。具体流程如下:https://www.bilibili.com/video/BV1Tu4y1q755/1、通过launch-build创建桌面应用。2、创建时候填入图片URL、名称和运行路径。3、点击运行,实现Canny边缘检测。

SwiftUI macOS全球开发资源汇总_macos 开发资源-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏7次。你说flash好用,苹果给封杀了。你说h5很灵活,苹果悄悄清洗h5。你说kotlin好用,苹果给你造了Swift。你说flutter好用,苹果就自己造了SwiftUI。苹果的原则很简单,我的世界必须都是我的。作为在苹果世界里面种地的码农,俺们还是要遵守人家都规则,能够native就尽量不要高跨平台,能用苹果制造就不要用google生产。大牛肯定要给你布道跨平台的优势,但是人家在做现象级别的app,可以和苹果讨价还价,而俺们这类普通程序员还是老老实实的用苹果造吧。WWDC2020更新汇总本次次._macos 开发资源

dcm4che3处理dicom文件基本操作-程序员宅基地

文章浏览阅读2.3k次。上一篇介绍了如何使用python来操作dicom文件,然后这里介绍一下使用java开源的工具dcm4che3来处理文件,达到一样的效果。 github:https://github.com/dcm4che/dcm4che 然后我们也可以看看官网的介绍,因为dicom涉及的范围比较多,所以d..._dcm4che3 解析dicom

随便推点

【信息系统项目管理师】高项知识框架--考点大汇总_高项管师章节重点知识归纳-程序员宅基地

文章浏览阅读5.9k次,点赞10次,收藏72次。【信息系统项目管理师】高项知识框架–考点大汇总_高项管师章节重点知识归纳

ASP.NET网站制作-程序员宅基地

文章浏览阅读6.4k次,点赞3次,收藏28次。ASP.NET网站制作1、ASP.NET页面对象1网页脚本当客户端通过客户浏览器发送HTTP请求时,web服务器将HTML文档部分和脚本部分返回给客户端浏览器,在客户端浏览器中解释执行并及时更新页面,脚本处理工作全部在客户端浏览器执行完成。优点: 减轻服务器负荷,同时增加页面的反应速度。缺点:浏览器差异性导致页面差异支持的语言: JavaScriptJScript VBScript(2)服务端脚本..._asp.net网站制作

车载 OTA技术概念_sota和ota的区别?-程序员宅基地

文章浏览阅读3k次,点赞10次,收藏54次。总的来说,OTA实现方案分为两种,一种与通常的刷写方式一样,即先擦除当前版本软件,再刷写新版本软件,但这种方法有个隐患,就是新软件有问题时,由于旧软件已经被擦除,没有备份,恢复会很麻烦,因此就提出了另一种,即A/B交换。(Firmware-Over-the-Air),是指不改变车辆原有配件的前提下,通过写入新的固件程序,使拥有联网功能的设备进行升级,包括车辆的发动机,电机,变速箱,底盘等控制系统,比如特斯拉曾通过FOTA新增过自动驾驶功能、增加过电池容量和改善过刹车距离等。,那都将是一项很繁重的任务。_sota和ota的区别?

清空数据库的方法_548数据库清库-程序员宅基地

文章浏览阅读744次。近来发现数据库过大,空间不足,因此打算将数据库的数据进行全面的清理,但表非常多,一张一张的清空,实在麻烦,因此就想利用SQL语句一次清空所有数据.找到了三种方法进行清空.使用的数据库为MS SQL SERVER.1.搜索出所有表名,构造为一条SQL语句declare @trun_name varchar(8000)set @trun_name=''select_548数据库清库

STL --- 四、算法 Algorithms_c++ algorithms-程序员宅基地

STL中的算法提供了丰富的功能,包括常用算法介绍和时间、空间复杂度的选择。在编写程序时需根据具体问题选择适当的算法,满足时间或空间需求。

【计算机网络学习笔记04】网络体系架构与网络协议_网络体系以及网络协议的定义和内容。-程序员宅基地

文章浏览阅读1.4w次。【计算机网络学习笔记04】网络体系架构与网络协议一、网络协议的概念和要素网络协议是计算机网络相互通信的对等层实体之间,用来交换信息时必须遵守的规则或约定的集合。这些为网络数据交换而制定的通信规则、约定与标准被统称为网络协议,简称协议。网络协议主要由三个基本要素组成,分别是语法、语义和时序。语法:用于定义数据和控制信息的结构或格式。语义:用于解释数据或控制信息的具体含义。时序(同步):用于对事件实现顺序的详细说明。二、计算机网络体系结构计算机网络各层、层中协议以及层间接口的集合(即网络层次_网络体系以及网络协议的定义和内容。

推荐文章

热门文章

相关标签