LA 4329 Ping pong 樹狀陣列

2021-10-06 04:08:19 字數 1414 閱讀 8603

樹狀陣列的典型應用, 參看 《演算法筆記》 475頁

對於有n個數的陣列 a(a[1] ~ a[n]), 對於每乙個元素,求出序列中,它的左邊比它小的數的個數

本題要點:

1、 題目見,《訓練指南》 197 頁

2、 ans 要用 long long

3、 輸入的陣列個數最大值為 20000, 每個 a[i] 的最大值為 100000,

**的 const int maxn = 100010 //如果 const int maxn = 20010, runtime error

#include

#include

#include

using

namespace std;

#define lowbit(i) ((i)&(-i))

// lowbit(x) 表示x的二進位制對應的值

const

int maxn =

100010

;int c[maxn]

;//陣列a的樹狀陣列, 下標,從1開始的

int d[maxn]

;//陣列 b的樹狀陣列

int n, test;

int a[maxn]

;int a_small[maxn]

;//陣列 a_small[i] 表示第i個數,其左邊比a[i] 小的元素個數

int b_small[maxn]

;//陣列 b_small[i] 表示第i個數,其左邊比b[i] 小的元素個數

//getsum()函式, 返回前x個數的和

intgetsum

(int x,

int* a)

return sum;

}//update()函式,將第x個數加上v

void

update

(int x,

int v,

int* a)

}int

main()

memset

(c,0

,sizeof

(c))

;for

(int i =

1; i <= n;

++i)

memset

(d,0

,sizeof

(d))

;for

(int i = n; i >=1;

--i)

long

long ans =0;

for(

int i =

2; i <= n -1;

++i)

printf

("%lld\n"

, ans);}

return0;

}/*13 1 2 3

*//*

1*/

LA 4329 Ping pong 樹狀陣列

題目傳送門 這道題與樹狀陣列求逆序對的思路有些近似,是一道樹狀陣列求字首的基礎題目。我們列舉第i個人當裁判的話,假設a1到a i 1 中有ci個比ai小,那麼就有 i 1 ci個比ai大,同理,假設a i 1 到an中有di個比ai小,那麼就有 n i di個比ai大,然後根據乘法原理和加法原理,i...

LA4329 樹狀陣列

分析 考慮第i個人當裁判。假設前i 1個人中有ci個比ai小,那麼就有 i 1 ci個比ai大 同理,設i 1到n有di個比ai小,那麼就有 n i di個比ai大。所以i當裁判有 ci n i di i ci 1 di種比賽。問題轉換為求ci和di。ci可以這麼計算 從左到右掃瞄所有的ai,令x ...

LA 4329(樹狀陣列)

演算法競賽入門經典 p197 題目大意 一條大街上住著n個桌球愛好者,經常比賽切磋技術。每個人都有乙個不同的技能值a i 每場比賽需要3個人 兩名選手,一名裁判。他們有個奇怪的約定,裁判必須住在兩名選手之間,而裁判的能力值也必須在兩名選手之間。問一共能組織多少種比賽。分析 假設a 1 到a i 1 ...