分析

简述“康托展开”

康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩。设有\(n\)个数\((1,2,3,4,…,n)\),可以有组成不同(\(n!\)种)的排列组合,康托展开表示的就是是当前排列组合在\(n\)个不同元素的全排列中的名次。式子表示:

\[X=\sum_{i=1}^{n}a_i*(i-1)!
\]

\(\rightarrow\)

\[X=a_n*(n-1)!+a_{n-1}*(n-2)!+...+a_i*(i-1)!+...+a_1*0!
\]

其中, \(a_i\)为整数,并且\(0\leq a_i\leq i, 0 < i \leq n,\) 表示当前未出现的的元素中排第几个,这就是康托展开。

推论

根据康托展开,\(S_i\)就是第\(i\)位上可选的数中比第\(i\)位上应选的数小的数的个数。那么此题转化为求总区间第\(S_i+1\)大。一颗权值线段树解决问题,不用持久化。康托展开的排名也是基于0的,所以也不用调用STL的last_permutation().

算法流程

  1. 用权值线段树求出总区间第\(S_i+1\)大,记答案为\(ans\)并输出
  2. 将权值线段树的\([ans,ans]\)叶节点置0

就这么简单

时间复杂度

对于单组数据,执行一次上述算法流程需要\(O(\log k)\)时间,而要执行\(k\)次,所以单组数据的时间复杂度为\(O(k\log k)\)。有\(T\)组数据所以总时间复杂度为\(O(T\cdot k\log k)\)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define rg register
template<typename T>T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(ch!='-'&&!isdigit(ch))
ch=getchar();
if(ch=='-')
w=-1,ch=getchar();
while(isdigit(ch))
data=data*10+ch-'0',ch=getchar();
return x=data*w;
}
using namespace std;
const int MAXK=5e4+7;
struct SegTree
{
int sum;
}ST[MAXK<<2];
#define root ST[o]
#define lson ST[o<<1]
#define rson ST[o<<1|1]
void pushup(int o)
{
root.sum=lson.sum+rson.sum;
} void build(int o,int l,int r)
{
if(l==r)
{
root.sum=1;
return;
}
int mid=(l+r)>>1;
build(o<<1,l,mid);
build(o<<1|1,mid+1,r);
pushup(o);
} int qkth(int o,int l,int r,int rnk)
{ // 边找边删,简化操作
if(l==r)
{
root.sum=0;
return l;
}
int mid=(l+r)>>1,ans;
if(rnk<=lson.sum)
ans=qkth(o<<1,l,mid,rnk);
else
ans=qkth(o<<1|1,mid+1,r,rnk-lson.sum);
pushup(o);
return ans;
} int main()
{
// freopen("UVa11525.in","r",stdin);
// freopen("UVa11525.out","w",stdout);
int T;
read(T);
while(T--)
{
memset(ST,0,sizeof(ST));
int k;
read(k);
build(1,1,k);
for(rg int i=1;i<=k;++i)
{
int s; // 不用开s数组,节省空间
read(s);
printf("%d%c",qkth(1,1,k,s+1),i==k?'\n':' ');
}
}
}

Hint

这题卡输出格式,必须按我那样写,不然会WA。(我就WA了好几次。)

UVA11525 【Permutation】的更多相关文章

  1. POJ 3187【permutation】

    POJ 3187 给定N值,从而确定了数据的范围及长度,暴力枚举数列,接下来类似杨辉三角的递推计算.注permutation从递增有序数列开始枚举,枚举到符合sum值时退出即可 #include &l ...

  2. POJ 2718【permutation】

    POJ 2718 问题描述: 给一串数,求划分后一个子集以某种排列构成一个数,余下数以某种排列构成另一个数,求这两个数最小的差,注意0开头的处理. 超时问题:一开始是得到一个数列的组合之后再从中间进行 ...

  3. 【agc030f】Permutation and Minimum(动态规划)

    [agc030f]Permutation and Minimum(动态规划) 题面 atcoder 给定一个长度为\(2n\)的残缺的排列\(A\),定义\(b_i=min\{A_{2i-1},A_{ ...

  4. 【题解】CF359B Permutation

    [题解]CF359B Permutation 求一个长度为\(2n\)的序列,满足\(\Sigma |a_{2i}-a_{2i-1}|-|\Sigma a_{2i}-a_{2i-1}|=2k\) 这种 ...

  5. 【线性代数】2-7:转置与变换(Transposes and Permutation)

    title: [线性代数]2-7:转置与变换(Transposes and Permutation) toc: true categories: Mathematic Linear Algebra d ...

  6. 【搜索】【并查集】Codeforces 691D Swaps in Permutation

    题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...

  7. 【数学】HDU 5753 Permutation Bo

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 题目大意: 两个序列h和c,h为1~n的乱序.h[0]=h[n+1]=0,[A]表示A为真则为 ...

  8. 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  9. 【原创】开源Math.NET基础数学类库使用(06)直接求解线性方程组

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

随机推荐

  1. php5.4 的 arm 交叉编译

    ./configure --prefix=/h1root/usr/php --host=arm-linux --enable-libxml --with-mysql=mysqlnd --with-my ...

  2. 雷林鹏分享:C# 特性(Attribute)

    C# 特性(Attribute) 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.您可以通过使用特性向程序添加声明性信息.一个声明 ...

  3. [.NET开发] C#实现剪切板功能

    C#剪切板 Clipboard类 我们现在先来看一下官方文档的介绍 位于:System.Windows.Forms 命名空间下 Provides methods to place data on an ...

  4. (GoRails) 如何去掉form输入框头尾的空格;何时用callbacks,gem;

    视频:https://gorails.com/episodes/when-callbacks-and-adding-dependencies-are-good?autoplay=1 主题:应当在什么时 ...

  5. thinkphp得到客户端的ip

    /** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @return mixed */function get_cli ...

  6. POJ-3083 Children of the Candy Corn (BFS+DFS)

    Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and mus ...

  7. page上BeanId与ActionType中的ParameterId

    今天遇到一件有意思的异常. 一个基于EO的VO在页面加载进来之后就CreateRow了一行数据,主键HeaderId也相应的插入了值,但是在保存的时候,老是报HeaderId不能为空的异常. 经查,页 ...

  8. qt +ChartDirector 绘制图表

    自从开发由c#转入Qt后一直寻找一款Qt下的图形控件库,最后ChartDirector控件映入眼球.ChartDirector控件使用方便,快捷,灵活,功能强大,交互性强.在web服务器以及嵌入式应用 ...

  9. notepad++设置右键

    Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\Shell\NotePad++][HKEY_CLASSES_ROOT\*\Shell\ ...

  10. Python gui编程pyQt5安装步骤t

    Python gui编程pyQt5安装步骤         pip install PyQt5 Pip3 install PyQt5               https://riverbankco ...