對戰 II(樹狀陣列)

2021-09-28 11:23:36 字數 1327 閱讀 9527

題目描述

在⼀條街道上有n個⼈,他們都喜歡打桌球。任意兩個⼈的家的位置都不相同,按順序標為1,2,…,n。每個⼈都有⼀定的⽔平,用兩兩不等的整數表示。

當兩個⼈想打球的時候,會找另⼀個⼈作為裁判,並到裁判家裡進⾏⼀場較量。出於某種原因,他們希望裁判的⽔平介於兩⼈之間;同時,他們希望兩個⼈到裁判家的總路程不超過兩個⼈的家的距離。

對於兩場較量,如果打球的兩個⼈不完全相同或者裁判不同,我們就認為這兩場較量不同。求不同的較量的總數。

輸入

輸⼊包含多組資料

輸⼊的第⼀⾏是⼀個整數t,表示資料組數;

每組資料佔⼀⾏,包含n+1個整數:n,a1,a2,···,an。其中a1,a2,···,an表示家位於相應位置的⼈的⽔平。

輸出

對每組資料,用⼀⾏輸出⼀個整數,表示不同的較量的總數。

樣例輸入

13 1 2 3

樣例輸出

1提示

對於40%的資料,有n≤1000;

對於所有資料,有t≤20,3≤n≤100000,每個⼈的⽔平都是不超過200000的正整數。

思路

對每乙個居民,分別求其的能力值大於多少居民的字首和和字尾和,列舉中間點,對於每個中間點,能組成一次比賽方式數量為l[i]*(n-i-r[i]);r[i]*(i-1-l[i]);,總和即為答案

**實現

#pragma gcc optimize(3,"ofast","inline")

#include using namespace std;

typedef long long ll;

const int n=200005;

const ll mod=19960515;

ll l[n],r[n],sum[n],a[n];

inline int lowbit(int x)

void add(int p,int x)

ll search(int p)

void init()

int main()

memset(sum,0,sizeof(sum));

for(int i=n;i;i--)

ll ans=0;

for(int i=2;iprintf("%lld\n",ans);

}return 0;

}

問題 F 對戰 II

題目描述 在 條街道上有n個 他們都喜歡打桌球。任意兩個 的家的位置都不相同,按順序標為1,2,n。每個 都有 定的 平,用兩兩不等的整數表示。當兩個 想打球的時候,會找另 個 作為裁判,並到裁判家裡進 場較量。出於某種原因,他們希望裁判的 平介於兩 之間 同時,他們希望兩個 到裁判家的總路程不超過...

問題 F 對戰 II

題目描述 在 條街道上有n個 他們都喜歡打桌球。任意兩個 的家的位置都不相同,按順序標為1,2,n。每個 都有 定的 平,用兩兩不等的整數表示。當兩個 想打球的時候,會找另 個 作為裁判,並到裁判家裡進 場較量。出於某種原因,他們希望裁判的 平介於兩 之間 同時,他們希望兩個 到裁判家的總路程不超過...

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...