codeforces 814B.An express train to reveries 解题报告
题目链接:http://codeforces.com/problemset/problem/814/B
题目意思:分别给定一个长度为 n 的不相同序列 a 和 b。这两个序列至少有 i 个位置(1 ≤ i ≤ n ), a[i] != b[i] 。现在需要构造一个长度为 n,每个数只能取值1~n 且只能取值一次的序列 p, 使得恰好存在有一个位置 i(1 ≤ i ≤ n ), ai ≠ pi 。和恰好存在一个位置 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 ≤ n )时,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 解题报告相关推荐
- Codeforces - 814B - An express train to reveries - 构造
http://codeforces.com/problemset/problem/814/B 构造题烦死人,一开始我还记录一大堆信息来构造p数列,其实因为s数列只有两项相等,也正好缺了一项,那就把两种 ...
- Codeforces Round #700 (Div. 2)A~D2解题报告
Codeforces Round #700 (Div. 2)A~D2解题报告 A Yet Another String Game 原题链接 http://codeforces.com/contest/ ...
- Codeforces Round #693 (Div. 3)A~G解题报告
Codeforces Round #693 (Div. 3)A~G解题报告 A Cards for Friends 原题信息 http://codeforces.com/contest/1472/pr ...
- Codeforces Round #697 (Div. 3)A~G解题报告
Codeforces Round #697 (Div. 3)A~G解题报告 题 A Odd Divisor 题目介绍 解题思路 乍一想本题,感觉有点迷迷糊糊,但是证难则反,直接考虑没有奇数因子的情况, ...
- 【codeforces 814B】An express train to reveries
[题目链接]:http://codeforces.com/contest/814/problem/B [题意] 给你两个元素个数都为n的序列a[]和b[] 要求你构造出一个排列p(1..n); 使得p ...
- #418 Div2 Problem B An express train to reveries (构造 || 全排列序列特性)
题目链接:http://codeforces.com/contest/814/problem/B 题意 : 有一个给出两个含有 n 个数的序列 a 和 b, 这两个序列和(1~n)的其中一个全排列序列 ...
- Codeforces Round #827 (Div. 4) G. Orray 解题报告
原题链接: Problem - G - Codeforces 题目描述: You are given an array aa consisting of nn nonnegative integers ...
- Codeforces Round #830 (Div. 2) B. Ugu 解题报告
原题链接: Problem - B - Codeforces 题目描述: A binary string is a string consisting only of the characters 0 ...
- Codeforces Round #626(Div.2) 解题报告
Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) [前言] 最近沉迷只狼,好久没有打CF了,水平 ...
最新文章
- Binwalk固件分析利器
- SQL的优化和注意事项
- 科大星云诗社动态20210827
- element-ui中用el-dialog+el-table+el-pagination实现文件默认选中且在分页的条件下有记忆功能...
- 在县城开一家彩票站,一个月能赚多少钱?
- Web框架——Flask系列之Jinja2自带过滤器(三)
- 几个常用的python脚本_几个很实用的python脚本
- 统计学(检验、分布)的 python(numpy/pandas/scipy) 实现
- react key值警告问题
- matlab 编写雷达波形,雷达信号处理+Matlab程序
- bp神经网络优化算法对比,提高bp神经网络精度
- 超详细的《使用腾讯云移动直播开发连麦》
- Hibernate缓存集成IMDG
- 什么是web前端技术?要学什么?
- face_recognition小实战:显示未知图片中已知人物的脸
- Did you install mysqlclient?
- table标签及排版详解(一)
- YOLSO: You Only Look Small Object
- golang---go mod 相关问题的解决方法(Unexpected module path、used for two different module)
- 聊聊php脚本执行流程
热门文章
- [办公应用]如何将excel合并单元格分拆后每个单元格上仍保留数据?
- 最新计算机科技成果,最新前沿科技成果
- 社交机器人检测:Detect Me If You Can: Spam Bot Detection Using InductiveRepresentation Learning--论文阅读
- 看华为技术专家的500页微服务架构笔记,感觉我格局太小
- Hive:split函数
- 实验2 用MATLAB 绘制二维、三维图形
- 使用Q-Dir解决无法删除AI文件的问题
- 企业数字化转型背景下,低代码成为降本增效的“杀手锏”
- cad线加粗怎么设置_CAD中怎么把一段线、曲线或圆弧加粗?
- 有什么不起眼却赚钱的行业??