Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针)
Posted kanoon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针)相关的知识,希望对你有一定的参考价值。
题目链接:https://codeforces.com/contest/1265/problem/B
题意
给出大小为 $n$ 的一个排列,问对于每个 $i(1 le i le n)$,原排列中是否有一个大小为 $i$ 的连续子排列。
题解
从小到大构造排列,记录当前排列中数的最小下标和最大下标,若最小下标和最大下标的间距刚好为排列的长度,则说明大小为 $i$ 的排列是连续的。
代码一
#include <bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; int pos[n + 1] = {}; for (int i = 0; i < n; i++) { int x; cin >> x; pos[x] = i; } int mi = n, mx = -1; for (int i = 1; i <= n; i++) { mi = min(mi, pos[i]); mx = max(mx, pos[i]); cout << (mx - mi == i - 1); } cout << " "; } int main() { int t; cin >> t; while (t--) solve(); }
代码二
虽然时间复杂度和空间复杂度都不如代码一,但是看上去更加简洁。
#include <bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; map<int, int> pos; for (int i = 0; i < n; i++) { int x; cin >> x; pos[x] = i; } set<int> st; for (int i = 1; i <= n; i++) { st.insert(pos[i]); cout << (*st.rbegin() - *st.begin() == i - 1); } cout << " "; } int main() { int t; cin >> t; while (t--) solve(); }
以上是关于Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #604 (Div. 2)
Codeforces Round #604 (Div. 2)
Codeforces Round #604 (Div. 2)
Codeforces Round #604 (Div. 2) A. Beautiful String
Codeforces Round #604 (Div. 2) D. Beautiful Sequence(构造)
Codeforces Round #604 (Div. 2) C. Beautiful Regional Contest