POJ2299題解(樹狀數組)

POJ2299題解node

2019-12-28ios

Powered by Gauss算法

1.題目傳送門:POJ2299數組

 

2.理解題意:數據結構

作題的時候,第一步也是最重要的就是理解題意。記住這句話。函數

POJ2299是一道標準的樹狀數組模板題。題意大體以下:spa

快速排序是一種很是優秀的排序方式,其精華在於循環比較和swap函數的應用。.net

先給你一個數N,表示這組數據(沒錯,這題是多組數據)數的個數,以後的N行,每行一個數Aicode

請你輸出在快速排序過程當中經歷的swap函數的次數。blog

3.算法思路:

樹狀數組是一種很是高效的數據結構,因爲篇幅有限,這裏不作講解,做者將盡快寫出一篇樹狀數組的稿子,敬請諒解。

樹狀數組的精華在於lowbit函數的使用,爲了迎合題目,這裏將query函數和update函數作了一些改動。

void update(int x,int k)
{
    int i;
    for(i=x;i<=n;i=i+lowbit(i))
    {
        tree[i]+=k;
    }
}
int query(int x)
{
    int i,sum=0;
    for(i=x;i>0;i=i-lowbit(i))
    {
        sum+=tree[i];
    }
    return sum;
}

咱們由於這道題的數據規模很是大,因此要用到一些離散化的思想。

for(i=1;i<=n;i++)
{
     cin>>a[i].value;
     a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i++)
{
    a[i].pos=i;
}

有了離散化,咱們就能夠大大下降時間複雜度了。

上面那段代碼中,咱們用結構體node來實現,包含三個參數,id,pos和value。

struct node
{
  int id,value,pos;
}a[500001];

最後,結合樹狀數組的計算模板,咱們給出最後的AC源代碼,用時3610MS:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int tree[500001],n;
struct node
{
  int id,value,pos;
}a[500001];
int lowbit(int x)
{
    return (x&(-x));
}
void update(int x,int k)
{
    int i;
    for(i=x;i<=n;i=i+lowbit(i))
    {
        tree[i]+=k;
    }
}
int query(int x)
{
    int i,sum=0;
    for(i=x;i>0;i=i-lowbit(i))
    {
        sum+=tree[i];
    }
  return sum;
}
int cmp(node a,node b)
{
    return a.value<b.value;
}
int cmp1(node a,node b)
{
    return a.id<b.id;
}
int main()
{
    int i;
    long long sum;
    while(cin>>n && n)
    {
        sum=0;
        memset(tree,0,sizeof(tree));
        for(i=1;i<=n;i++)
        {
            cin>>a[i].value;
            a[i].id=i;
        }
        sort(a+1,a+n+1,cmp);
        for(i=1;i<=n;i++)
        {
            a[i].pos=i;
        }
        sort(a+1,a+n+1,cmp1);
        for(i=1;i<=n;i++)
        {
            sum+=i-1-query(a[i].pos);
            update(a[i].pos,1);
        }
        cout<<sum<<endl;
    }
    return 0;
}

版權聲明:知識產權神聖不可侵犯,這篇文章中的部分代碼和思想源自:https://blog.csdn.net/weixin_43918531/article/details/87950037

相關文章
相關標籤/搜索