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 
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 << "\n";
}

int main() {
    int t; cin >> t;
    while (t--) solve();
}

代码二

虽然时间复杂度和空间复杂度都不如代码一,但是看上去更加简洁。

#include 
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 << "\n";
}

int main() {
    int t; cin >> t;
    while (t--) solve();
}

 

你可能感兴趣的:(Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针))