题目链接: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(); }