題目:就是求乙個陣列的逆序數,然後依次將陣列的第乙個數調到最後,最後求出最小的逆序數
做了兩種,線段樹和樹狀陣列
//利用線段樹求逆序數
// 每次將數字x插到線段樹的 x 位置,然後球一下,該線段樹右邊的和,即為逆序數的個數
//第一次用線段樹,做這個。。
#include#include#include#include#includeusing namespace std;
#define maxn 5555
int sum[maxn<<2];
int x[maxn];
/*void build(int l,int r,int rt)//其實build 可以省略
*/void build(int l,int r,int rt)
void push_up(int rt)
void update(int p,int l,int r,int rt)
int mid=(l+r)>>1;
if(p<=mid)update(p,l,mid,rt<<1);
else update(p,mid+1,r,rt<<1|1);
push_up(rt);
}int query(int l,int r,int l,int r,int rt)
int main()
void add(int x,int value)
int sum(int x) //找出x前面比x小的數的個數
int main()
{ // freopen("q.txt","r",stdin);
while(scanf("%d",&n)==1)
{int res=0;
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{scanf("%d",&a[i]);
a[i]++;
// cout<_<)~~~~ 還需要再認真思考啊,總是參照別人對的**,當然很容易作對啊
hdu1394 樹狀陣列 解法
本題使用樹狀陣列果然更加快。樹狀陣列難點 1 如何遍歷樹 2 如何利用陣列資料 建立乙個樹狀陣列就如上圖紅色部分代表所有的樹狀陣列節點了。基本操作 查詢下乙個節點的計算,如不明白下面函式的作用,請檢視負數記憶體存放的問題。簡而言之就是 內存放是求反 1 利用這個函式可以神奇地尋找到其單親節點和兄弟節...
hdu 1394 樹狀陣列求逆序數
解題思路 這道題是求迴圈陣列中逆序數最小值,求逆序數這裡肯定是用樹狀陣列。只是這裡有一點點變化,由於題目中n位數是0 n 1的乙個排列,所以num i 可表示為比num i 小的數的個數。把第一位的數挪到最後一位,那麼整個序列的逆序數變化為ans ans num 0 n 1 num 0 num 0 ...
HDU 1394 樹狀陣列求逆序數
題意 給你n個數,每次將其第乙個元素放後面,要你算出這期間所產生的最小逆序數。題解 首先用樹狀陣列求出原序列所產生的逆序數,然後根據性質算出公式sum n a i 1 a i 具體結合 更好理解。include include include using namespace std const in...