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