poj 2182 樹狀陣列

2022-05-22 07:18:08 字數 1076 閱讀 3200

這題對於o(n^2)的演算法有很多,我這隨便貼乙個爛的,跑了375ms。

#include#include

using

namespace

std;

int mat[8008

];int

main()

}for(i=0;i)

printf(

"%d\n

",mat[i]);

return0;

}

view code

還是來看樹狀陣列的解法。我們從後面往見面看,假設第i個牛前面有rank[i]個牛標號比他小,由此很容易得出最後乙個牛的編號一定是rank[n]+1。我們將最後乙個牛去掉後,剩下n-1牛時,對於第n-1個牛的道理是一樣的,只不過不同的是rank[n-1]+1之前有多少個牛已經不存在了,即已經確定位置。我們就用樹狀陣列儲存被去掉的牛個數,c[i]表示標號i之前已經有多少個牛確定位置。那麼我們每次就是要找某個數k,使得k-c[k]==rank[i]+1。這就是第i個牛的確定位置。

#include#include

#include

#include

#include

#define maxn 8010

#define inf 0x7fffffff

#define lowbit(x) (x&(-x))

using

namespace

std;

intc[maxn],n,rank[maxn],ans[maxn];

void

init()

int sum(int

pos)

return

sum;

}void update(int pos,int

num)

}int getpos(int

i)

returnl;}

intmain()

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

printf(

"%d\n

",ans[i]);

}return0;

}

poj 2182 線段樹 樹狀陣列

題目大意 n個數排成一排 不知道大小,只是佔了乙個位置 從a 1 到a n 進行遍歷,對於每個a i 給出從a 1 到a i 1 中小於a i 數的個數。要求出 a 1 到a n 中這n個數的相對順序。題目分析 則 a i 在所有n個數中的序號 按照從小到大排序 為 k less i t 1 但是,...

poj2182 樹狀陣列 二分)

題意 給乙個數n,然後n 1行,每行乙個數q,第i個數qi代表第i 1頭牛前面有qi頭牛編號比它小,求所有牛的編號。因為只有最後一頭牛編號是確定的,所有從後往前,每次用二分找到數字,並用樹狀陣列確定和儲存。include include include includeusing namespace ...

poj 2182 單點修改

題意 有n頭牛,標號從1到n,現在牛排成乙個佇列,知道每個牛的前面比自己標號小的牛的數量,輸出每個牛的標號。題解 給出的序列的最後乙個數字是可以推出的,然後把這個數字拿走,又能知道前面有幾個數字,和之前做過的有幾個空位乙個道理,維護線段樹區間解決。include include include us...