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