Codeforces Global Round 20
2022/4/24 23:14:56
本文主要是介绍Codeforces Global Round 20,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
比赛链接:
https://codeforces.com/contest/1672
D. Cyclic Rotation
题目大意:
长为 \(n\) 的序列 \(a\),每一步操作可以选择 \(i\) 和 \(j\),要满足 \(a_i = a_j\),然后让 \(a[l...r] = [a_{l + 1}, a_{l + 2}, ... , a_{r}, a_{l}]\)。
给一个序列 \(b\),它是 \(a\) 的排列,问 \(a\) 能不能通过若干次操作变成 \(b\)。
思路:
反过来思考,考虑 \(b\) 能否变成 \(a\)。
从左往右考虑的话,无法确定哪些元素可以往右移动,所以从右往左考虑。
用双指针,其中 \(i\) 指向序列 \(a\),\(j\) 指向序列 \(b\)。
若 \(b_j = b_{j - 1}\),那么 \(b_j\) 一定可以移动到左边的一个位置上。
若不相等,则考虑 \(a_i\) 是不是等于 \(b_j\)。
若不是,再考虑这个位置是不是右边移动过来的。
还不是,那就意味着 \(b\) 不能变成 \(a\)。
每一个元素是否移动过,可以用 \(map\) 来记录。
代码:
#include <bits/stdc++.h> using namespace std; int T, n; void solve(){ cin >> n; vector <int> a(n + 1), b(n + 1); for (int i = 1; i <= n; i ++ ) cin >> a[i]; for (int i = 1; i <= n; i ++ ) cin >> b[i]; int i = n, j = n; map <int, int> c; while (i > 0){ while (b[j] == b[j - 1]){ c[b[j]] ++ ; j -- ; } if (a[i] == b[j]){ i -- ; j -- ; } else{ if (c[a[i]] > 0){ c[a[i]] --; i --; } else{ cout << "NO\n"; return; } } } cout << "YES\n"; } int main(){ ios::sync_with_stdio(false);cin.tie(0); cin >> T; while ( T -- ) solve(); return 0; }
这篇关于Codeforces Global Round 20的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享