题意:有一个由1到k组成的序列,最小是1 2 … k,最大是 k k-1 … 1,给出n的计算方式,n = s0 * (k - 1)! + s1 * (k - 2)! +… + sk-1 * 0!, 给出s1…sk,输出序列里第n大的序列. 析:我们先看第一数,如果第一个数是2,那么它前面至少有(k-1)!个排列,然后1开头肯定比2要小,同理,再考虑第二个数,在考虑再二数时, 要注意把已经搞定的数去掉,所以我们用线段树进行单点更新,当然也可以用二分+数状数组. 代码如下: #pragma com…
题意:给你k个数Si,然后给你一个等式   H= ∑  Si ∗ (K − i)!  (i=(1->k)且0 ≤ Si ≤ K − i). 叫你求出第H个全排列 其实这是一个康托展开:X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! ,其中a[i]为当前未出现的元素中是排在第几个(从0开始).这就是康托展开.我们也可以找规律解决 接着就是二分树状数组解决第S+1个未出现的位置的经典题了 #include<set> #inclu…
只要注意到对于譬如:S1*(k-1)! 因为后面k-1个数字的全排列个数刚好是(k-1)!,那么第一个数字就是没有取过的数字的第(S1+1)个即可.取走这个数字以后这个数字就不能再用了,依次类推即可得到整个排列了. 那么随便用线段树维护一下即可. 代码如下: #include <stdio.h> #include <algorithm> #include <string.h> #define t_mid (l+r>>1) #define ls (o<&…
Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序,并将所有排列编号(从0开始),给出排列的编号得到对应排列)用到的式子.可以想到用逆康托展开的方法.但是需要一些变化: ;i--) { s[i-]+=s[i]/(n-i+); s[i]%=(n-i+); } 例如:n=3时,3=0*2!+0*1!+3*0!应该变为3=1*2!+1*1!+0*0!.就…
UVA 1232 - SKYLINE option=com_onlinejudge&Itemid=8&page=show_problem&category=502&problem=3673&mosmsg=Submission+received+with+ID+13967519" target="_blank" style="">题目链接 题意:按顺序建房.在一条线段上,每一个房子一个高度.要求出每间房子建上去后…
Squared Permutation Time Limit: 6000ms Memory Limit: 262144KB 64-bit integer IO format: %lld      Java class name: Main 最近,无聊的过河船同学在玩一种奇怪的名为“小Q的恶作剧”的纸牌游戏. 现在过河船同学手有张牌,分别写着,打乱顺序之后排成一行,位置从左往右按照标号. 接下来小Q同学会给出个操作,分为以下两种: 1.给定,交换从左往右数的第和第张牌, 2.给定,对从左往右数的第…
题目意思是说  给你一个数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个了) 比方对于数列{…
题目传送门 题意:训练指南P248 分析:逆向考虑,比如一个全排列:7345261,它也可以表示成题目中的形式,第一个数字7是由6 * (7 - 1)得到的,第二个数字3有2 * (7 - 2)得到,所以只要树状数组单点修改二分(找最远的因为有些位置是0)查询当前第s[i] + 1的数字(在BIT中指前p项和为s[i] + 1). #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int s[N]; str…
题意: 平面上有\(n\)个点,有一种操作和一种查询: \(road \, A \, B\):在\(a\),\(b\)两点之间加一条边 \(line C\):询问直线\(y=C\)经过的连通分量的个数以及这些连通分量点的总数 分析: 其实横坐标是没用的,首先可以先将纵坐标离散化. 用并查集维护点的连通性,连通分量的大小以及连通分量中纵坐标的最大值和最小值. 线段树中维护的是每条直线穿过的连通分量的个数以及点的个数之和. 当两个连通分量合并时,先把两个小连通分量从线段树中删去,然后再把合并之后的大…
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2520 题意:有一个排列1~k,求第n个排列,其中n为 ,K(1≤K≤50000),S1, S2 ,…, Sk.(0≤Si≤K-i). 分析:这道题目乍看之下没有什么好的思路,k!太大了,但是仔细看一看就会发现n和康托展开式很类似 如果不知道康托展开的话请看:http://www.d…