题目链接:http://codeforces.com/problemset/problem/814/B

题目意思:分别给定一个长度为 n 的不相同序列 a 和 b。这两个序列至少有 i 个位置(1 ≤ i ≤ ), a[i] != b[i] 。现在需要构造一个长度为 n,每个数只能取值1~n 且只能取值一次的序列 p, 使得恰好存在有一个位置 i(1 ≤ i ≤ ), ai ≠ p。和恰好存在一个位置 j (1 ≤ j ≤ n) , bj ≠ pj  ,保证这个序列 p 有n-1个位置是跟序列a和b的数是相同的。如果有多个符合的序列,输出任意一个即可。

  【 中文解说起来怎么感觉有点啰哩吧嗦的 = = (大家还是看不明白意思且自问英文还过得去的,建议直接看英文意思)】

题目解析:首先,p序列取值范围1~n(这个我有看到),但只能取值一次,这个貌似真的没有说,看到后台测试样例才发现。这个有点坑。

  然后我们不难想到先构造一条保存 a[i] = b[i](p[i]=a[i]), a[j] != b[j] (p[j] = 0,代表未知) 的 p 序列。

  接着可以发现题目说, a 和 b 有 i 个位置的数是不相同的。其实,这个 i 只能为 1 (test3)或者 2(这个情况比较多)。

  分析 i = 1 这种情况,只可能 a != b, 所以填入一个不等于 a 和 b 的数就可以了(前提要有一个 vis 数组标记,所以没有 vis 过的就是该填的数了)

  分析 i = 2 这种情况,假设 a 序列对应 a1、a2,  b 序列对应b1、b2, p在这两个位置分别取值p1、p2

  (1)a1=a2,b1=b2, a1!=b1    ——》 p1=a1, p2=b1 或者 p1=b1,p2=a2

  (2)a1=a2!=b1,b1!=b2  或者   a1!= a2 , b1=b2!=a1

  (3)a1 != a2 != b1 != b2

  情况(2)、(3),p的取值需要根据当前a1、a2,b1、b2,是否vis过来取。当序列a和b相同位置且值相同,就标记访问过。这样当遇到 (2)(3)情况,取值就取没有 vis 过的。

  当然我们还需要进行一次预处理。为啥?

  先看 test37这个例子。因为是先处理第三个位置的,但是a[3] 和 b[3] 都都没有vis过, 如果很不幸的取了b[3]=1,而不是 a[3]=3, 之后第四个位置就无值可取了(都vis过)。然后这种思路解题就不适合了。

5
5 4 3 5 2
5 4 1 1 2

  所以这个预处理就是保存a[i] = b[i] (1 ≤ i ≤ )时,vis[a[i]] =1之后,当遇到 a[j] != b[j] 时(1 ≤ j ≤ n),但有可能 a[j] 或者 b[j] 是 vis 过的,此时也要打标记。这个先后出现顺序是没所谓的,大家想想就明白了。

  构造题还是挺考思维的,而且想问题得全面点呢~~~

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 const int maxn = 1000 + 5;
 9 int a[maxn], b[maxn];
10 int p[maxn];
11 int vis[maxn];
12 int n;
13
14 void Output()
15 {
16     for (int i = 1; i <= n; i++) {
17         printf("%d%c", p[i], i != n ? ' ': '\n');
18     }
19 }
20
21
22 int main()
23 {
24     #ifndef ONLINE_JUDGE
25         freopen("in1.txt", "r", stdin);
26     #endif // ONLINE_JUDGE
27
28     while (scanf("%d", &n) !=EOF) {
29         for (int i = 1; i <= n; i++) {
30             scanf("%d", &a[i]);
31             p[i] = vis[i] = 0;
32         }
33
34         int cntzero = 0, pos = 0;
35         for (int i = 1; i <= n; i++) {
36             scanf("%d", &b[i]);
37             if (b[i] == a[i]) {
38                 p[i] = b[i];
39                 vis[b[i]] = 1;
40             }
41             else {   //b[i] != a[i]
42                 if (vis[b[i]] && !vis[a[i]]) {
43                     p[i] = a[i];
44                     vis[a[i]] = 1;
45                 }
46                 else if (!vis[b[i]] && vis[a[i]]) {
47                     p[i] = b[i];
48                     vis[b[i]] = 1;
49                 }
50                 cntzero++;
51                 pos = i;
52             }
53         }
54
55         if (cntzero == 1 && b[pos] != a[pos]) {
56             for (int j = 1; j <= n; j++) {
57                 if (!vis[j]) {
58                     p[pos] = j;
59                     break;
60                 }
61             }
62         }
63         // cntzero = 2
64         else {
65             for (int i = 1; i <= n; i++) {
66                 if (p[i] == 0) {
67                     if (!vis[a[i]] && vis[b[i]]) {
68                         p[i] = a[i];
69                         vis[p[i]] = 1;
70                     }
71                     // vis[a[i]] && !vis[b[i]] 或者 !vis[a[i]] && !vis[b[i]]
72                     else   {
73                         p[i] = b[i];
74                         vis[p[i]] = 1;
75                     }
76                 }
77             }
78         }
79         Output();
80     }
81     return 0;
82 }

 

转载于:https://www.cnblogs.com/windysai/p/6970660.html

codeforces 814B.An express train to reveries 解题报告相关推荐

  1. Codeforces - 814B - An express train to reveries - 构造

    http://codeforces.com/problemset/problem/814/B 构造题烦死人,一开始我还记录一大堆信息来构造p数列,其实因为s数列只有两项相等,也正好缺了一项,那就把两种 ...

  2. Codeforces Round #700 (Div. 2)A~D2解题报告

    Codeforces Round #700 (Div. 2)A~D2解题报告 A Yet Another String Game 原题链接 http://codeforces.com/contest/ ...

  3. Codeforces Round #693 (Div. 3)A~G解题报告

    Codeforces Round #693 (Div. 3)A~G解题报告 A Cards for Friends 原题信息 http://codeforces.com/contest/1472/pr ...

  4. Codeforces Round #697 (Div. 3)A~G解题报告

    Codeforces Round #697 (Div. 3)A~G解题报告 题 A Odd Divisor 题目介绍 解题思路 乍一想本题,感觉有点迷迷糊糊,但是证难则反,直接考虑没有奇数因子的情况, ...

  5. 【codeforces 814B】An express train to reveries

    [题目链接]:http://codeforces.com/contest/814/problem/B [题意] 给你两个元素个数都为n的序列a[]和b[] 要求你构造出一个排列p(1..n); 使得p ...

  6. #418 Div2 Problem B An express train to reveries (构造 || 全排列序列特性)

    题目链接:http://codeforces.com/contest/814/problem/B 题意 : 有一个给出两个含有 n 个数的序列 a 和 b, 这两个序列和(1~n)的其中一个全排列序列 ...

  7. Codeforces Round #827 (Div. 4) G. Orray 解题报告

    原题链接: Problem - G - Codeforces 题目描述: You are given an array aa consisting of nn nonnegative integers ...

  8. Codeforces Round #830 (Div. 2) B. Ugu 解题报告

    原题链接: Problem - B - Codeforces 题目描述: A binary string is a string consisting only of the characters 0 ...

  9. Codeforces Round #626(Div.2) 解题报告

    Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) [前言] 最近沉迷只狼,好久没有打CF了,水平 ...

最新文章

  1. 轻松一刻:程序员的工作状态
  2. CSS中关于margin的理解误区
  3. 【Git】Git 本地的撤销修改和删除操作
  4. java创建二叉树并递归遍历二叉树
  5. ELFHash的理解
  6. 计算机底层书籍三件套--大话计算机
  7. spring mvc 异步_DeferredResult – Spring MVC中的异步处理
  8. js求渐升数的第100位
  9. python3.8 实现鼠标自动移动_“新生报到”!【移动机器人 HD-1500】负载1500kg,实现了重型货物运输的自动化...
  10. 查询oracle数据库里面所有的表名
  11. 选择排序java从小到大代码_java中选择排序与归并排序的内容,详细解析
  12. 《ArcGIS Runtime SDK for .NET开发笔记》--在线编辑
  13. Redis-数据结构02-简单动态字符串(sds)
  14. html5中秋博饼,2020年中秋博饼优秀作文(精选5篇)
  15. visio2019安装教程
  16. linux 用livego+obs推流视频并用yolov5检测
  17. DTI-ATS入门(1):DTI综述
  18. MATLAB找勾股数,一种寻找勾股数的方法
  19. 基于jsp的实验室预约管理系统的设计与实现
  20. 如何将多行和多列转换为行和行Excel

热门文章

  1. 翻转矩阵flipud和fliplr函数
  2. 未能加载文件或程序集“log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a”或它的某一个依赖项
  3. 深度学习 ---- 深度学习调参,CNN参数调参,各个参数理解和说明以及调整的要领。
  4. Sed命令替换指定文件中某一行所有内容
  5. 同花顺选股python开发_量化交易。最新版通用版同花顺客户端的Python3 API
  6. jquery.media.js 插件实现在线预览PDF文件
  7. 计算机硬盘的容量的最小,这些游戏的大小竟然有100G以上,硬盘小的电脑就不要考虑了...
  8. vue项目中使用g2统计图
  9. R语言ggplot2 | 多图排版
  10. 【亡羊补牢】计算机网络灵魂之问 第12期 tcp握手结束第一次的包有多大