构造求调
查看原帖
构造求调
375953
Lgx_Q楼主2023/3/18 12:51

排列长度有保证,就是构造出的排列方案数不对

求调

#include<bits/stdc++.h>
//#include "perm.h"
#define ll long long
using namespace std;
#include <vector>

std::vector<int> construct_permutation(ll);
ll q,m,n,a[200],b[200],h[200],ht,f[200];
vector<int>vec;
void ins(ll p,ll x)
{
	for(ll i=198;i>=p;i--) a[i+1]=a[i];
	a[p]=x;
}
ll sub(ll i)
{
	return 200-i*2+1;
}
vector<int> construct_permutation(ll m)
{
	vec.clear();
	for(ll i=0;i<200;i++) a[i]=b[i]=h[i]=0;
	ll tmp=log2(m);
	for(ll i=0;i<tmp;i++) a[tmp-i]=200-i*2;
	
	ll cnt=0;
	for(ll i=tmp-1;~i;i--)
		if(m&(1ll<<i))
		{
			if(i==0)
			{
				ins(1,1e9);
			}
			else if(m&(1ll<<i-1))
			{
				if(cnt<2)
				{
					++cnt;
					ins(1,sub(i));
				}
				else
				{
					ins(3,sub(i-1));
					--i;
				}
			}
			else
			{
				ins(1,sub(i));
			}
		}
	
	n=ht=0;
	for(ll i=1;i<200;i++)
		if(a[i]) b[++n]=a[i], h[n]=a[i];
	sort(h+1,h+1+n);
	for(ll i=1;i<=n;i++)
		vec.push_back(lower_bound(h+1,h+1+n,b[i])-h-1);
	return vec;
}
//int main()
//{
//	ll q;
//	scanf("%lld",&q);
//	while(q--)
//	{
//		ll m;
//		scanf("%lld",&m);
//		vector<int>vec=construct_permutation(m);
//		ll s=0;
//		printf("%lld ",vec.size());
//		for(ll i=0;i<vec.size();i++)
//		{
//			f[i]=1;
//			for(ll j=0;j<i;j++)
//				if(vec[j]<vec[i]) f[i]+=f[j];
//			s+=f[i];
//			printf("%lld ",vec[i]);
//		}
//		printf("\n");
////		if(s+1==m) printf("YES\n");
////		else printf("NO\n");
//	}
//	return 0;
//}
2023/3/18 12:51
加载中...