題目
首先我們要知道康托展開的公式:
即∑(rand(a[i])-1)*(n-i)!(1<=i<=n)(rand(i)表示i在之前序列中未出現的第幾個)
(n-i)!我們可以用o( n)的複雜度預處理出來。辣麼rand(i),我們怎麼求呢?
如果暴力列舉鐵定超時。我們想想可以用什麼來查詢,我們可以用樹狀陣列來查詢(看演算法標籤)。
#include#includeusing namespace std;
typedef long long ll;
const int maxn=1e6+10;
const ll p=998244353;
ll n,a[maxn],ans;
ll f[maxn],c[maxn];
void update(int x,int k)
int deal(int x)
int main()
cout<
return 0;
}
康拓展開 P5367 模板 康托展開
舉個栗子大家應該就能懂了 我現在生成了1 5的全排列,求數列5 2 3 1 4是第幾個 5 有四個數比他小,他後面還有4個數,所以他的貢獻應該是4 4!2 有乙個數比他小,他後面還有3個數,所以他的貢獻應該是1 3!3 有兩個數比他小,他後面還有兩個數,但是其中2在前面出現過了,所以他的貢獻應該是1...
luogu P5367 模板 康托展開
傳送門 剛開始背的式子,一測wawawa.式子背錯了.然後請教了下大佬。就考慮比當前排列字典序小的有哪些。第i個位置,後邊剩下n i個位置沒有填,所以 n i 考慮第i個位置,就再乘以 i ask a i ask a i 為再i位置之前出現的比a i 小的數的個數。用樹狀陣列維護 include d...
模板 康托展開
搜尋有時會用到的康托展開與康托收攏 第一行,兩個整數n和m,n表示數字1到n構成的全排列,m表示詢問數 接下來m行,表示詢問,每行兩個整數x和y,x 1表示第一種詢問,回答y的排名 x 2表示第2種詢問,答出排名為y的數字 include define int long long using nam...