Codeforces Round 992 (Div. 2) C. Ordered Permutations

给出数字n,构造一个符合的数组

很容易想到,
n == 1时,只有1符合。
n == 2时,有1 2;2 1符合。
n == 3时,有1 2 3;1 3 2;2 3 1;3 2 1;

发现必须分为 1 和 2——n 的两块数字,有某种递归的感觉,答案与2次方有关
于是做出代码

#include<iostream>
#include<algorithm>
using namespace std;
#define ffp(x,y,z) for(ll (x) = (y);(x)<=(z);(x++))
#define ffs(x,y,z) for(ll (x) = (y);(x)>=(z);(x--))
#define ll long long int
#define q_ (qd())
long long int qd() {
	long long w = 1, c, ret;
	while ((c = getchar()) > '9' || c < '0')
		w = (c == '-' ? -1 : 1); ret = c - '0';
	while ((c = getchar()) >= '0' && c <= '9')
		ret = ret * 10 + c - '0';
	return ret * w;
}
ll qs(ll a, ll b)
{
	ll bei = a;
	a = 1;
	while (b)
	{
		if (b & 1) { a = a * bei % MOD; }
		bei = bei * bei % MOD;
		b >>= 1;
	}
	return a;
}
bool change[200200];
ll n = 0;
void dfs(int now)
{
	if (now == n + 1) { return; }
	if (change[now])
	{
		dfs(now + 1);
		cout << now << ' ';
	}
	else
	{
		cout << now << ' ';
		dfs(now + 1);
	}
}

int main()
{
	int t = q_;
	while (t--)
	{
		n = q_;
		ll k = q_;
		ll temp = n-1;
		int cnt = n+1;
		ll ttemp = 1;
		while (temp)
		{
			ttemp *= 2;
			temp--;
			if (ttemp >= k) { cnt = n - 1; break; }
		}
		if (ttemp >= k) { cnt = n - 1; }
		if (cnt > n) { cout << -1 << endl; continue; }
		//递归寻找数组
		k -= 1;
		temp = k; ttemp = 0;
		while (temp)
		{
			temp >>= 1;
			ttemp++;
		}
		for (int i = n-1 ; i >=n-ttemp; i--)
		{
			if (k & 1) { change[i] = 1; }
			k >>= 1;
		}
		dfs(1);
		cout << endl;
		fill(change, change + 1 + n, 0);
	}

	return 0;
}
posted @   A了这道题就上床睡觉  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示