Beautiful Numbers(找排列的一个连续区间)

You are given a permutation p=[p1,p2,…,pn]p=[p1,p2,…,pn] of integers from 11 to nn. Let's call the number mm (1≤m≤n1≤m≤n) beautiful, if there exists two indices l,rl,r (1≤l≤r≤n1≤l≤r≤n), such that the numbers [pl,pl+1,…,pr][pl,pl+1,…,pr] is a permutation of numbers 1,2,…,m1,2,…,m.

For example, let p=[4,5,1,3,2,6]p=[4,5,1,3,2,6]. In this case, the numbers 1,3,5,61,3,5,6 are beautiful and 2,42,4 are not. It is because:

  • if l=3l=3 and r=3r=3 we will have a permutation [1][1] for m=1m=1;
  • if l=3l=3 and r=5r=5 we will have a permutation [1,3,2][1,3,2] for m=3m=3;
  • if l=1l=1 and r=5r=5 we will have a permutation [4,5,1,3,2][4,5,1,3,2] for m=5m=5;
  • if l=1l=1 and r=6r=6 we will have a permutation [4,5,1,3,2,6][4,5,1,3,2,6] for m=6m=6;
  • it is impossible to take some ll and rr, such that [pl,pl+1,…,pr][pl,pl+1,…,pr] is a permutation of numbers 1,2,…,m1,2,…,m for m=2m=2 and for m=4m=4.

You are given a permutation p=[p1,p2,…,pn]p=[p1,p2,…,pn]. For all mm (1≤m≤n1≤m≤n) determine if it is a beautiful number or not.

Input

The first line contains the only integer tt (1≤t≤10001≤t≤1000)  — the number of test cases in the input. The next lines contain the description of test cases.

The first line of a test case contains a number nn (1≤n≤2⋅1051≤n≤2⋅105) — the length of the given permutation pp. The next line contains nn integers p1,p2,…,pnp1,p2,…,pn (1≤pi≤n1≤pi≤n, all pipiare different) — the given permutation pp.

It is guaranteed, that the sum of nn from all test cases in the input doesn't exceed 2⋅1052⋅105.

Output

Print tt lines — the answers to test cases in the order they are given in the input.

The answer to a test case is the string of length nn, there the ii-th character is equal to 11 if iiis a beautiful number and is equal to 00 if ii is not a beautiful number.

Example

input

Copy

3
6
4 5 1 3 2 6
5
5 3 1 2 4
4
1 4 3 2

output

Copy

101011
11111
1001

Note

The first test case is described in the problem statement.

In the second test case all numbers from 11 to 55 are beautiful:

  • if l=3l=3 and r=3r=3 we will have a permutation [1][1] for m=1m=1;
  • if l=3l=3 and r=4r=4 we will have a permutation [1,2][1,2] for m=2m=2;
  • if l=2l=2 and r=4r=4 we will have a permutation [3,1,2][3,1,2] for m=3m=3;
  • if l=2l=2 and r=5r=5 we will have a permutation [3,1,2,4][3,1,2,4] for m=4m=4;
  • if l=1l=1 and r=5r=5 we will have a permutation [5,3,1,2,4][5,3,1,2,4] for m=5m=5;

 题意:第一行给出一个数n,接下来一行给出n个数(n的一个排列),对于n的排列中的每个数i,如果能找到一个连续的区间为这个数的一个排列,那么答案的字符串的i号位置就记为1,否则记为0;最后输出表示答案的字符串。

思路:以为对于任意一个连续区间,如果正好是一个数i的一个排列,那么区间长度显然等于这个数i。因此,对于1~n的每个数i,我们只需要找出包含i的排列(即:1~i这几个数)的最短区间,判断区间长度是否等于i即可。对于每个数,我们用l记录1~i的下标的最小值作为区间左端点,用r记录1~i的下标的最大值作为区间右端点,区间长度即为:d=r-l+1,判断d是否等于i即可。

完整代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
using namespace std;
#define int long long
const int maxn=2e5+5;
int t,n,a[maxn];
map<int,int>mp;
string ans;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>n;
		ans="";
		mp.clear();
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			mp[a[i]]=i;
		}
		int l=n+1,r=-1;
		for(int i=1;i<=n;i++)
		{
			l=min(mp[i],l);
			r=max(mp[i],r);
			int d=r-l+1;
			if(d==i){
				ans+='1';
			}
			else{
				ans+='0';
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}
发布了89 篇原创文章 · 获赞 5 · 访问量 6707

猜你喜欢

转载自blog.csdn.net/Mr_Kingk/article/details/103429554