[学习笔记]Cantor展开/CF501D
Cantor展开
这是大概半年前学到的trick,今天突然想起来就来复习一下。
我们知道对于
Cantor展开就是做这件事情,我们定义最小的排列
举个栗子
对于任意一个排列
以
实现
容易发现,一个排列
一些事项
Cantor展开其实是一个变进制数,在一些地方似乎能用得上(好像有见过)。
Cantor展开的值虽然很大,不过感觉更多时候是算系数来解决一些问题。
逆过程
都说是一一对应关系,那一个自然数也应该要能映射回去对吧?首先一个具体的数字转换成
接下来就是要怎么通过系数求出具体的排列了,依然用前面的栗子,
一个比较简单的实现就还是一个树状数组:值域树状数组,一开始全部设为1,每次二分找到最小的前缀和超过
CF501D
给两个排列
就是一个裸的Cantor展开啦:
rep(i,1,n)modify(i,1); rep(i,1,n){ f[i]=query(a[i]); modify(a[i]+1,-1); } rep(i,1,n)modify(i,1); rep(i,1,n){ f[i]+=query(b[i]); modify(b[i]+1,-1); } for(int i=n;i>=1;i--)if(f[i]>n-i){ f[i-1]++; f[i]%=n-i+1; } rep(i,1,n)modify(i,1); rep(i,1,n){ int l=1,r=n,ret=-1; while(l<=r){ int mid=(l+r)>>1; int q=query(mid); if(q<f[i]+1)l=mid+1; else{ r=mid-1; ret=mid; } } modify(ret,-1); printf("%d ",ret-1); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律