zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    drf 三大认证详解
    管理表页面的创建
    电脑自动关机设置
    jwt 认证规则
    视图家族练习
    JQuery 数组获取和删除元素
    JQurey 添加和删除元素
    Java 占位符
    Redis
    线程
  • 原文地址:https://www.cnblogs.com/Kanoon/p/13192373.html
Copyright © 2011-2022 走看看