[CF1450D] Rating Compression
Description
给定序列,问长度为 (k) 的滑动窗口最小值是否构成排列
Solution
(k=1) 的情况特判掉
用双端队列,初态为 ([a_1,a_2,...,a_n])
从 (1) 到 (n) 枚举 (c) 的长度 (i)
若数 (i) 没有出现,则长度 (ge i) 的都废了
若数 (i) 出现了,则长度 (=i) 的活了
若数 (i) 出现在当前剩余部分的头尾,那么删掉他并继续
若数 (i) 出现在当前剩余部分的中间,或者出现次数大于 (1),那么长度 (>i) 的都死了
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n;
cin >> n;
vector<int> a(n + 2);
for (int i = 1; i <= n; i++)
cin >> a[i];
vector<int> ans(n + 2);
vector<int> cnt(n + 2);
for (int i = 1; i <= n; i++)
cnt[a[i]]++;
if (*max_element(&cnt[1], &cnt[n + 1]) == 1)
ans[1] = 1;
deque<int> que;
for (int i = 1; i <= n; i++)
que.push_front(a[i]);
for (int i = 1; i < n; i++)
{
if (cnt[i] == 0)
break;
ans[n - i + 1] = 1;
if (que.front() == i)
que.pop_front();
else if (que.back() == i)
que.pop_back();
else
break;
if (cnt[i] > 1)
break;
}
for (int i = 1; i <= n; i++)
cout << ans[i];
cout << endl;
}
signed main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
{
solve();
}
}