求逆序對模板題(完善模板 樹狀陣列或歸併排序)

2021-09-30 12:52:00 字數 2185 閱讀 1856

link:

時間限制:

10000ms

單點時限:

1000ms

記憶體限制:

256mb

描述在上一回、上上回以及上上上回里我們知道nettle在玩《艦これ》。經過了一番苦戰之後,nettle又獲得了的很多很多的船。

這一天nettle在檢查自己的艦隊列表:

我們可以看到,船預設排序是以等級為引數。但實際上乙個船的火力值和等級的關係並不大,所以會存在a船比b船等級高,但是a船火力卻低於b船這樣的情況。比如上圖中77級的飛龍改二火力就小於55級的夕立改二。

現在nettle將按照等級高低的順序給出所有船的火力值,請你計算出一共有多少對船滿足上面提到的這種情況。

輸入第1行:1個整數n。n表示艦船數量, 1≤n≤100,000

第2行:n個整數,第i個數表示等級第i低的船的火力值a[i],1≤a[i]≤2^31-1。

輸出第1行:乙個整數,表示有多少對船滿足「a船比b船等級高,但是a船火力低於b船」。

樣例輸入

10

1559614248 709366232 500801802 128741032 1669935692 1993231896 369000208 381379206 962247088 237855491

樣例輸出

27
樹狀陣列:

#include #include #include #define maxn 500005

using namespace std;

int n;

struct node

input[maxn]; //儲存輸入的陣列

int aa[maxn]; //儲存離散化操作後的結果

int cmp(const void* a, const void* b) //離散化操作時排序用

//標準的樹狀陣列的操作

///int c[maxn]; //這個就是樹狀陣列, 每次開始時都清零

int lowbit(int x)

void update(int n, int delta)

}int getsum(int n)

return result;

}int main()

qsort(&input[1], n, sizeof(node), cmp);

for(i = 1; i<= n; i++) aa[input[i].num] = i;

//運用樹狀陣列這個資料結構的操作來計算逆序數

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

c[i] = 0;

long long result = 0;

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

cout << result << endl;

}return 0;

}

歸併排序:

#include #include #include using namespace std;

const int n = 100010;

int a[n],tmp[n];

long long ans;

void merge(int l,int m,int r)

else

}while(i <= m) tmp[k++] = a[i++];

while(j <= r) tmp[k++] = a[j++];

for(int i=l;i<=r;i++)

a[i] = tmp[i];

}void merge_sort(int l,int r)

}int main()

{ //freopen("d:\\in.txt","r",stdin);

int n,t,tt=1;

// scanf("%d",&t);

// while(t--)

//{while(~scanf("%d",&n))

{ for(int i=0;i

樹狀陣列模板 逆序對

顧名思義,lowbit這個函式的功能就是求某乙個數的二進位制表示中最低的一位1,舉個例子,x 6,它的二進位制為110,那麼lowbit x 就返回2,因為最後一位1表示2。求lowbit的兩種方法 int lowbit x int lowbit x c i 代表 子樹的葉子結點的權值之和 c 1 ...

求逆序對 樹狀陣列 歸併排序模板

ps 但資料大的時候,需要離散化陣列會多乙個排序的複雜的,其實還不如歸併找逆序對塊 歸併找逆序對也是o n logn 樹狀陣列 include include include include include include includeusing namespace std const int i...

樹狀陣列 模板3 求逆序對(非離散化)

離散化的樹狀陣列 這裡就提一下和普通樹狀陣列的區別,這裡是用要查詢的數當作下標,而普通樹狀陣列是直接順序下標放值,也就是說區別在於 updata函式,普通的是updata i,k 這裡的i就單純是區間下標 而求逆序對的時候是updata a i 1 我們每次都是在這個數字大小的位置上新增1,然後去更...