
cf1509E - Almost Sorted
发布日期:2021-05-07 22:06:57
浏览次数:21
分类:精选文章
本文共 1613 字,大约阅读时间需要 5 分钟。
cf1509E - Almost Sorted
题意: 定义almost sorted的排列是 a i + 1 ≥ a i − 1 a_{i+1} \geq a_i - 1 ai+1≥ai−1,给出排列长度n,问字典序第k大的排列
可以发现长度为n的满足的排列只有 2 n − 1 2^{n - 1} 2n−1个,注意直接位移会溢出,(n1e5)
自己刚开始在想从长度为n到长度为n+1的转移,前一半是每个数+1然后在开头放1,(没有什么头绪
题解感觉很妙很妙,
将n分块,每一段表示长度为 n u m i num_i numi 的顺序递减序列,这与要求的almost sorted排列一一对应,于是可以将问题转化过来
用0表示每个段的末尾,1表示剩下的,(最后一位必是0于是我们先不管)这样可以很愉快地得到一个二进制,他刚好就是k-1的二进制表示(二进制从0000开始,则第k个就是k-1的二进制
题解给了一张示意图(高度表示数
x轴01是刚才的二进制,#includeusing namespace std;typedef unsigned long long ll;ll n, k;string getBin(ll x) { string s = ""; for (int i = 0; i < n; i++) s += '0'; k--; for (ll b = 0; b < min((ll) 60, (ll) (n - 1)); b++) { if ((k >> b) & 1) s[n - 2 - b] = '1'; } return s;}vector vec;int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int T; cin >> T; while (T--) { vec.clear(); cin >> n >> k; if (n <= 62 && k > (1ll << (n - 1))) { cout << -1 << endl; continue; } string tmp = getBin(k); int len = tmp.size(); int cnt = 0; for (int i = 0; i < len; ++i) { if (tmp[i] == '0') { vec.push_back(cnt + 1); cnt = 0; } else { cnt++; } } if (cnt) { vec.push_back(cnt); } int nw = 0, pre = 0; for (auto x: vec) { pre = nw; nw = nw + x; for (int i = nw; i > pre; --i) { cout << i << " "; } } cout << endl; } return 0;}
发表评论
最新留言
很好
[***.229.124.182]2025年03月22日 18时55分49秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
软中断和实时性
2021-05-09
Linux探测工具BCC(可观测性)
2021-05-09
Opentelemetry Metrics SDK
2021-05-09
流量控制--2.传统的流量控制元素
2021-05-09
SNMP介绍及使用,超有用,建议收藏!
2021-05-09
SDUT2161:Simple Game(NIM博弈+巴什博弈)
2021-05-09
51nod 1596 搬货物(二进制处理)
2021-05-09
来自星星的祝福(容斥+排列组合)
2021-05-09
Hmz 的女装(递推)
2021-05-09
HDU5589:Tree(莫队+01字典树)
2021-05-09
不停机替换线上代码? 你没听错,Arthas它能做到
2021-05-09
sharding-jdbc 分库分表的 4种分片策略,还蛮简单的
2021-05-09
分库分表的 9种分布式主键ID 生成方案,挺全乎的
2021-05-09
MySQL不会丢失数据的秘密,就藏在它的 7种日志里
2021-05-09
Python开发之序列化与反序列化:pickle、json模块使用详解
2021-05-09
回顾-生成 vs 判别模型-和图
2021-05-09
采坑 - 字符串的 "" 与 pd.isnull()
2021-05-09
无序列表 - 链表
2021-05-09
SQL 查询强化 - 数据准备
2021-05-09