洛谷 P5367 模板 康托展開

2021-09-22 10:17:51 字數 520 閱讀 2356

題目

首先我們要知道康托展開的公式:

即∑(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...