這題對於o(n^2)的演算法有很多,我這隨便貼乙個爛的,跑了375ms。
#include#includeview codeusing
namespace
std;
int mat[8008
];int
main()
}for(i=0;i)
printf(
"%d\n
",mat[i]);
return0;
}
還是來看樹狀陣列的解法。我們從後面往見面看,假設第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...