UVA11525 【Permutation】
分析
简述“康托展开”
康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩。设有\(n\)个数\((1,2,3,4,…,n)\),可以有组成不同(\(n!\)种)的排列组合,康托展开表示的就是是当前排列组合在\(n\)个不同元素的全排列中的名次。式子表示:
\]
\(\rightarrow\)
\]
其中, \(a_i\)为整数,并且\(0\leq a_i\leq i, 0 < i \leq n,\) 表示当前未出现的的元素中排第几个,这就是康托展开。
推论
根据康托展开,\(S_i\)就是第\(i\)位上可选的数中比第\(i\)位上应选的数小的数的个数。那么此题转化为求总区间第\(S_i+1\)大。一颗权值线段树解决问题,不用持久化。康托展开的排名也是基于0的,所以也不用调用STL的last_permutation().
算法流程
- 用权值线段树求出总区间第\(S_i+1\)大,记答案为\(ans\)并输出
- 将权值线段树的\([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】的更多相关文章
- POJ 3187【permutation】
POJ 3187 给定N值,从而确定了数据的范围及长度,暴力枚举数列,接下来类似杨辉三角的递推计算.注permutation从递增有序数列开始枚举,枚举到符合sum值时退出即可 #include &l ...
- POJ 2718【permutation】
POJ 2718 问题描述: 给一串数,求划分后一个子集以某种排列构成一个数,余下数以某种排列构成另一个数,求这两个数最小的差,注意0开头的处理. 超时问题:一开始是得到一个数列的组合之后再从中间进行 ...
- 【agc030f】Permutation and Minimum(动态规划)
[agc030f]Permutation and Minimum(动态规划) 题面 atcoder 给定一个长度为\(2n\)的残缺的排列\(A\),定义\(b_i=min\{A_{2i-1},A_{ ...
- 【题解】CF359B Permutation
[题解]CF359B Permutation 求一个长度为\(2n\)的序列,满足\(\Sigma |a_{2i}-a_{2i-1}|-|\Sigma a_{2i}-a_{2i-1}|=2k\) 这种 ...
- 【线性代数】2-7:转置与变换(Transposes and Permutation)
title: [线性代数]2-7:转置与变换(Transposes and Permutation) toc: true categories: Mathematic Linear Algebra d ...
- 【搜索】【并查集】Codeforces 691D Swaps in Permutation
题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...
- 【数学】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为真则为 ...
- 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成
本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...
- 【原创】开源Math.NET基础数学类库使用(06)直接求解线性方程组
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
随机推荐
- canvas和图片之间的互相装换
canvas和图片之间的互相装换 一.总结 一句话总结:一个是canvas的drawImage方法,一个是canvas的toDataURL方法 canvas drawImage() Image对象 c ...
- Linux系统基本常识
在虚拟机里装一个Linux(centos),有时间可以装个mac玩一下.(使用centos或者Ubuntu时安装软件将会非常方便) ifconfig –a 显示当前Linux主机的 ip 地址 如何让 ...
- cf188C(最大子段和&&思维)
C. Functions again time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 多种方法实现 python 线程池
最近在做一个爬虫相关的项目,单线程的整站爬虫,耗时真的不是一般的巨大,运行一次也是心累,,,所以,要想实现整站爬虫,多线程是不可避免的,那么python多线程又应该怎样实现呢?这里主要要几个问题(关于 ...
- python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA
加密与解密,这很重要,我们已经可以用pypcap+npcap简单嗅探到网络中的数据包了.而这个工具其实可以嗅探到更多的数据.如果我们和别人之间传输的数据被别人嗅探到,那么信息泄漏,信息被篡改,将给我们 ...
- pyinstaller又踩一坑, configparser os.mknod
在使用pyinstaller时,有使用configparser模块. 使用相对路径.在pycharm中测试,正常,打包成exe,就出错了 换用绝对路径, print(os.getcwd()) fp_d ...
- svn断开重连,避免重建工作空间
1. 右键项目-->Team-->断开连接 2.选择从文件系统中删除SVN元信息 3.右键项目-->Team-->share project-->svn 4.创建新的资源 ...
- 关于Forsaken Isle
像素化的饥荒,但是和饥荒比起来,生存压力小了不少. 主要突出的是物品合成上 开始主要采集树枝,须根,岩石,燧石一个须根可以生成一根绳子 挺休闲的,种种菜,合合装备 未来版本会有魔法,潜水,巨龙,土族部 ...
- php include,require 主要是向网页中引入文件
- mysql 的 java 连接库
mysql 的 java 连接库 解压缩mysql-connector-java-5.1.30.zip 将要使用的是mysql-connector-java-5.1.30-bin-g.jar和mysq ...