cf #779 div2 思维 C. Shinju and the Lost Permutation


题意:

定义一个前缀最大数组的概念,如{5,4,3,6,1,2},覆盖后变为{5,5,5,6,6,6}(从前往后大的覆盖小的) 得到的不同数的个数为当前排列的p值。
给出n和n个p值,问是否存在这种排列

思路:

6
1
1
2
1 2
2
2 2
6
1 2 4 6 3 5
6
2 3 1 2 3 4
3
3 2 1
看给定的输入和输出,稍微模拟,会发现最大的数在第一个位置的时候p为1。
如2 3 1 2 3 4
循环后把1放在最后一个位置 变成 1 2 3 4 2 3
我们可以用插入的办法维护一个数列
6
x,6
x-a,x,6
x-a-b,x-a,x,6
此时到2操作了,要使得只剩两个数,这个数一定是x y,6
接下来是3
y-a,y,6
符合

我们会发现,原来p的顺序应该是 要么比前面一个数大1(因为一次不可能增加>=2个),要么比前面一个数小或等于,并且一组p种只能有1个1。以此作为判断条件即可。

#include
using namespace std;
signed main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		vectora;
		for(int i=0;i>num;
			a.push_back(num);
		}
		int flag=-1;
		for(int i=0;ib;
			for(int i=flag;i1)
				{
					continue;
				}else
				{
					fg=1;
					break;
				}
			}
			
			if(fg)
			{
				cout<<"NO"<