UVA11525 Permutation
UVA11525 Permutation
题意
给你一个正整数
你要输出长度为
思路
如果你曾经听说过康托展开的话,那么恭喜你,你又会了一道水蓝。
如果没有的话,也不要紧,现在就去做模板题 P5367 吧!那里题解区的老哥讲的比我清楚的多逃。
做完模板题后,再来看这个题,你会发现,题目给出的这个式子是不是跟康托展开的式子有点像?
没错,题目给出的这个
这当然也是简单的,如果你已经深刻理解了康托展开的具体过程,那么不难发现题目中的
可能听上去有些拗口,不过看了代码,就会明白的。
代码
时间复杂度是
当然是可以用权值线段树或者平衡树做到
/** * @file UVA11525 Permutation.cpp * @author ForgotDream * @brief 逆康托展开 * @date 2023-02-28 */ #include <bits/stdc++.h> using i64 = long long; void solve() { int k; std::cin >> k; std::vector<int> s(k), rest(k); for (auto &i : s) { std::cin >> i; } std::iota(rest.begin(), rest.end(), 1); // 这一句的作用是生成一个递增的 1 ~ n 的序列 std::vector<int> ans; for (int i = 0; i < k; i++) { ans.push_back(rest[s[i]]); // 找到当前项的数字 rest.erase(rest.begin() + s[i]); // 删去这一项 } for (int i = 0; i < k; i++) { std::cout << ans[i] << " \n"[i == k - 1]; } return; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int T; std::cin >> T; while (T--) { solve(); } return 0; }
本文作者:forgot-dream
本文链接:https://www.cnblogs.com/forgot-dream/p/17167930.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步