全部评论 2

  • #include <iostream>
    #include <vector>
    #include <unordered_map>
    #include <string>
    using namespace std;
    
    void solve() {
        int n;
        cin >> n;
        vector<int> a(n);
        unordered_map<int, int> first_pos, last_pos;
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
            if (first_pos.find(a[i]) == first_pos.end()) {
                first_pos[a[i]] = i;
            }
            last_pos[a[i]] = i;
        }
        
        vector<int> ans(n, 0);
        int min_first = n, max_last = -1;    
        for (int m = 1; m <= n; ++m) {
            min_first = min(min_first, first_pos[m]);
            max_last = max(max_last, last_pos[m]);
            
            if (max_last - min_first + 1 == m) {
                ans[m - 1] = 1; 
            }
        }
        
        for (int num : ans) {
            cout << num;
        }
        cout << endl;
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        
        int T;
        cin >> T;
        while (T--) {
            solve();
        }
        return 0;
    }
    

    2025-06-27 来自 浙江

    0
  • 当m变化时,实际上全排列的区间是从1所在位置不断向两边延伸的,在延伸时会优先选择数字比较小的一侧前进。所以,只需要模拟区间的范围变化,记录1~m范围内的数的个数,与m进行比较即可。
    已经在区间内的数需要标记,每次区间变化时,查询变化后的m这个数是否被标记过,如果标记过也要计入范围内。

    2024-08-03 来自 浙江

    0

热门讨论