time limit per test
2 seconds
memory limit per test
256 megabytes
You are given an array a of distinct integers.
In one operation, you may either:
- choose a nonempty prefix∗ of a and replace it with its minimum value, or
- choose a nonempty suffix† of a and replace it with its maximum value.
Note that you may choose the entire array a.
For each element ai, determine if there exists some sequence of operations to transform a into [ai]; that is, make the array a consist of only one element, which is ai. Output your answer as a binary string of length n, where the i-th character is 1 if there exists a sequence to transform a into [ai], and 0 otherwise.
∗A prefix of an array is a subarray consisting of the first k elements of the array, for some integer k.
†A suffix of an array is a subarray consisting of the last k elements of the array, for some integer k.
Input
The first line contains an integer t (1≤t≤104) --- the number of test cases.
The first line of each test case contains one integer n (2≤n≤2⋅105) --- the size of the array a.
The second line of each test case contains n integers, a1,a2,...,an (1≤ai≤106). It is guaranteed that all ai are distinct.
It is guaranteed that the sum of n over all test cases does not exceed 2⋅105.
Output
For each test case, output a binary string of length n --- the i-th character should be 1 if there exists a sequence of operations as described above, and 0 otherwise.
Example
Input
Copy
3
6
1 3 5 4 7 2
4
13 10 12 20
7
1 2 3 4 5 6 7
Output
Copy
100011
1101
1000001
Note
In the first sample, you can first choose the prefix of size 3. Then the array is transformed into
|---|---|---|---|
| 1 | 4 | 7 | 2 |
Next, you can choose the suffix of size 2. Then the array is transformed into
|---|---|---|
| 1 | 4 | 7 |
Finally, you can choose the prefix of size 3. Then the array is transformed into
|---|
| 1 |
So we see that it is possible to transform a into [1].
It can be shown that it is impossible to transform a into [3].
解题说明:此题是一道字符串题,给定一个字符串,需要找到一个子字符串,使得该子字符串的前缀中的最小字符尽可能大,而后缀中的最大字符尽可能小。可以通过遍历找出前缀的最小值,以及后缀的最大值,选择使得前缀最小值尽可能大且后缀最大值尽可能小的子字符串。
cpp
#include <stdio.h>
int arr[200006];
int ans[200006];
int main()
{
int t;
scanf("%d ", &t);
while (t--)
{
int n;
scanf("%d ", &n);
for (int i = 0; i < n; i++)
{
scanf("%d ", &arr[i]);
ans[i] = 0;
}
ans[0] = 1;
ans[n - 1] = 1;
int min = arr[0];
for (int i = 1; i < n - 1; i++)
{
if (arr[i] < min)
{
ans[i] = 1;
min = arr[i];
}
}
int max = arr[n - 1];
for (int i = n - 2; i > 0; i--)
{
if (arr[i] > max)
{
ans[i] = 1;
max = arr[i];
}
}
for (int i = 0; i < n; i++)
{
printf("%d", ans[i]);
}
printf("\n");
}
return 0;
}