luogu P5367 模板 康托展開

2022-05-25 12:24:09 字數 700 閱讀 3414

傳送門:

剛開始背的式子,一測wawawa......(式子背錯了.....

然後請教了下大佬。

就考慮比當前排列字典序小的有哪些。

第i個位置,後邊剩下n-i個位置沒有填,所以(n-i)!

考慮第i個位置,就再乘以( i-ask(a[i]) )  ask(a[i])為再i位置之前出現的比a[i]小的數的個數。(用樹狀陣列維護

#include#define r registertypedef 

long

long

ll;using

namespace

std;

const

int mod=998244353

;int n,a[1001000],c[1001000

];inline

void add(int

x)inline

int ask(int

x)ll rev[

1001000

],ans;

inline

int abc(int

x)int

main ()

for(r int i=1;i<=n;i++)

printf(

"%lld\n

",(ans+1)%mod);

return0;

}

view code

康拓展開 P5367 模板 康托展開

舉個栗子大家應該就能懂了 我現在生成了1 5的全排列,求數列5 2 3 1 4是第幾個 5 有四個數比他小,他後面還有4個數,所以他的貢獻應該是4 4!2 有乙個數比他小,他後面還有3個數,所以他的貢獻應該是1 3!3 有兩個數比他小,他後面還有兩個數,但是其中2在前面出現過了,所以他的貢獻應該是1...

洛谷 P5367 模板 康托展開

題目 首先我們要知道康托展開的公式 即 rand a i 1 n i 1 i n rand i 表示i在之前序列中未出現的第幾個 n i 我們可以用o n 的複雜度預處理出來。辣麼rand i 我們怎麼求呢?如果暴力列舉鐵定超時。我們想想可以用什麼來查詢,我們可以用樹狀陣列來查詢 看演算法標籤 in...

模板 康托展開

搜尋有時會用到的康托展開與康托收攏 第一行,兩個整數n和m,n表示數字1到n構成的全排列,m表示詢問數 接下來m行,表示詢問,每行兩個整數x和y,x 1表示第一種詢問,回答y的排名 x 2表示第2種詢問,答出排名為y的數字 include define int long long using nam...