码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针)

时间:2020-06-25 19:16:52      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:i++   int   ++   复杂度   空间   复杂   说明   color   cout   

题目链接: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 << "\n";
}

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

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

 

Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针)

标签:i++   int   ++   复杂度   空间   复杂   说明   color   cout   

原文地址:https://www.cnblogs.com/Kanoon/p/13192373.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!