UVA 11525 - Permutation(樹狀數組)

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   for   2014   

UVA 11525 - Permutation

題目連結

題意:給定一個k個數字,求第n個全排列,由於n很大,輸入的方式為∑k1Si?(K?i)!

思路:全排列,很容易看出,前面的si對應的就是數組中第k小的數字,那麼問題變成每次找第k小的數字,然後去掉這個數字,這個用樹狀數組很容易實現

代碼:

#include <cstdio>#include <cstring>#define lowbit(x) (x&(-x))const int N = 50005;int t, k, bit[N];void add(int x, int v) {    while (x <= k) {bit[x] += v;x += lowbit(x);    }}int get(int x) {    int ans = 0, num = 0;    for (int i = 16; i >= 0; i--) {ans += (1<<i);if (ans >= k || bit[ans] + num >= x)    ans -= (1<<i);else num += bit[ans];    }    return ans + 1;}int main() {    scanf("%d", &t);    while (t--) {memset(bit, 0, sizeof(bit));scanf("%d", &k);for (int i = 1; i <= k; i++)    add(i, 1);int num;for (int i = 1; i <= k; i++) {    scanf("%d", &num);    num++;    int v = get(num);    printf("%d%c", v, i == k ? '\n' : ' ');    add(v, -1);}    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.