UVA 11525 Permutation(树状数组)
题目意思是说 给你一个数k 然后有k个si 问你1--k 的第n个全排列是多少 注意是 1 2 3...k的全排列 不是si的
N=
由观察得知(k-i)!就是k-i个数字的全排列种数, 0=<Si<=k-i,所以显然可知如果当i==1时从第(k-1)!*s1到第n个全排列都是由第S1+1个数字開始的数列,由于每(k-1)!次排列过后,下一个排列的第1个数字都要增大1(每隔(k-1)!次,这k-1个数字都排列过一遍了,下一次仅仅能增大更前面一个,也就是第1个了)
比方对于数列{1,2,3,4},如果S1=2,当i==1的时候对于2*(4-1)!,从0到(4-1)!排列一定是1,x,x,x,从1*(4-1)!到2*(4-1)!排列一定是2,x,x,x,从2*(4-1)!到3*(4-1)!的排列一定是3,x,x,x所以我们就知道了S1等于2的话,第一个数字一定是3,这样我们就计算出了第一数字。。即我们确定这个数列一定是3,x,x,x
所以这样我们通过S1能够计算出第一个数字,S2计算出第二个数字直到求出结果。。简单的说就是由S1我们在这K个数字中找到第S1+1大的数字放在第一位,然后用剩下的K-1个数字去排列剩下的全排列,相同的在这剩下的K-1个数字中找到第S2+1大的数字放在最前面
然后就用树状数组求第Si+1大啦~ 这个就不细说了
code(比較丑陋,不要介意~):
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define ufor(a,b,c) for(int a=b;a<c;a++)
#define dfor(a,b,c) for(int a=b;a>c;a--)
#define LL long long
#define clr(arr,val) memset(arr,val,sizeof(arr))
using namespace std;
const int maxn=50005;
int a[maxn];
int c[maxn];
int k;
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int val)
{
while(x<=k)
{
c[x]+=val;
x+=lowbit(x);
}
}
int sum(int x)
{
int num=0,ans=0;
dfor(i,16,-1)
{
num+=(1<<i);
if(num>=k || c[num]+ans >= x)
num-=(1<<i);
else ans+=c[num];
}
return num+1;
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
cin>>k;
clr(c,0);
ufor(i,1,k+1)
add(i,1);
int tmp;
ufor(i,0,k)
{
cin>>tmp;
tmp++;
int ans=sum(tmp);
cout<<ans;
if(i!=k-1)
cout<<" ";
else
cout<<"\n";
add(ans,-1);
}
}
return 0;
}
UVA 11525 Permutation(树状数组)的更多相关文章
- [Codeforces 1208D]Restore Permutation (树状数组)
[Codeforces 1208D]Restore Permutation (树状数组) 题面 有一个长度为n的排列a.对于每个元素i,\(s_i\)表示\(\sum_{j=1,a_j<a_i} ...
- D. Restore Permutation 树状数组+二分
D. Restore Permutation 题意:给定n个数a[i],a[ i ]表示在[b[1],b[i-1]]这些数中比 b[i]小的数的和,要你构造这样的b[i]序列 题解:利用树状数组 求比 ...
- Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)
Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...
- UVA 11525 Permutation (树状数组+YY)
题意:给你k个数Si,然后给你一个等式 H= ∑ Si ∗ (K − i)! (i=(1->k)且0 ≤ Si ≤ K − i). 叫你求出第H个全排列 其实这是一个康托展开:X=a[n ...
- UVA11525 Permutation[康托展开 树状数组求第k小值]
UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...
- UVA 1513 - Movie collection(树状数组)
UVA 1513 - Movie collection option=com_onlinejudge&Itemid=8&page=show_problem&category=5 ...
- UVA 11990 `Dynamic'' Inversion CDQ分治, 归并排序, 树状数组, 尺取法, 三偏序统计 难度: 2
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)
E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...
- UVA 11423 - Cache Simulator (树状数组)
UVA 11423 - Cache Simulator (树状数组) option=com_onlinejudge&Itemid=8&category=523&page=sho ...
随机推荐
- Windows 8 键盘上推自定义处理
原文:Windows 8 键盘上推自定义处理 在Windows 8 应用程序中,当TextBox控件获得焦点时,输入面板会弹出,如果TextBox控件处于页面下半部分,则系统会将页面上推是的TextB ...
- nodejs 递归创建目录
nodejs没有递归创建目录的方法,以前创建的时候是将目录通过path.sep,然后再一步步判断,这个方法在windows下面遇到盘符的时候,然后蛋疼了.今天又用到了这个功能,突然想到了另外一种方法, ...
- Gradle多项目配置的一个demo
ParentProject├─build.gradle├─settings.gradle├─libs├─subProject1├────────────build.gradle├─────────── ...
- Team Foundation Server 2015使用教程--tfs用户账号切换
- Windows PHone 8 获取硬件信息
/// <summary> /// 获取系统信息 /// </summary> private string GetDeviceInfo() { StringBuilder s ...
- Python 实现类似PHP的strip_tags功能,并能够定义他们自己的一套保留标记
最近的研究 Python ,发现还是很习惯使用,多PHP这是非常easy该功能Python 这不得不找了半天,而且非常灵活不得不实现自己的. 我们今天聚集,需要过滤的内容标签,搞一个PM.外形似终于想 ...
- css3 翻牌(rotate) 以及翻转 导致边缘锯齿解决 方法
主要知识点:rotate旋转以及 outline透明的像素消除(明显降低)火狐旋转是产生的 锯齿 首先看结构: <li class="flip-container " ...
- String.Format in Java and C#
原文:String.Format in Java and C# JDK1.5中,String类新增了一个很有用的静态方法String.format(): format(Locale l, String ...
- C#开发中使用配置文件
C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...
- ExecutorService invokeAll 实例(转)
10个班级,每个班级20名学生,在指定的时间内查询每个班级学生的集合. package cn.com.ld.study.thread; import java.util.ArrayList; impo ...