題目描述
在⼀條街道上有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的正整數。
題解:題目要求滿足ai < aj < ak || ai > aj > ak ,其中i
< j < k , 滿足這兩個條件的個數有多少, 我們來列舉中間的j,判斷左面小於(大於)它 , 右邊大於(小於)它的個數, 然後相乘, 解這種題目, 類似於用樹狀陣列求解逆序對, 不過這個資料範圍好像有點小, 不需要進行離散化就可以了,先將左邊小於a[i] 的個數儲存到l[i] 中 , 直接插入a[i],同理將右邊大於a[i]的儲存到r[i] , 插入a[i] , 不過在處理大於a[i] 的過程中,我們用反向的,最後列舉(2 , n -1) 作為中間點, 然後進行 判斷左面小於(大於)它 , 右邊大於(小於)它的個數, 然後相乘 , 即l[i] * (n - i - r[i]) + r[i] * (i - 1 - l[i]) ,
// (n-i-r[i]) 表示右邊比 i 大的
// (i-l[i]-1) 表示左邊比 i 大的
#include
#include
using namespace std;
const
int n =
2e5+10;
typedef long
long ll ;
ll a[n]
, c[n]
, l[n]
, r[n]
;ll lowbit
(int x)
ll ask
(int x)
ll n ;
void
add(
int x ,
int y)
intmain()
memset
(c ,
0, sizeof c)
;for
(int i = n ;i >=
1;i --
) ll ans =0;
for(
int i =
2;i <= n -
1;i ++
) ans += l[i]
*(n - i - r[i]
)+ r[i]
*(i -
1- l[i]);
cout << ans << endl ;
}return0;
}
問題 F 對戰 II
題目描述 在 條街道上有n個 他們都喜歡打桌球。任意兩個 的家的位置都不相同,按順序標為1,2,n。每個 都有 定的 平,用兩兩不等的整數表示。當兩個 想打球的時候,會找另 個 作為裁判,並到裁判家裡進 場較量。出於某種原因,他們希望裁判的 平介於兩 之間 同時,他們希望兩個 到裁判家的總路程不超過...
對戰 II(樹狀陣列)
題目描述 在 條街道上有n個 他們都喜歡打桌球。任意兩個 的家的位置都不相同,按順序標為1,2,n。每個 都有 定的 平,用兩兩不等的整數表示。當兩個 想打球的時候,會找另 個 作為裁判,並到裁判家裡進 場較量。出於某種原因,他們希望裁判的 平介於兩 之間 同時,他們希望兩個 到裁判家的總路程不超過...
約瑟夫問題II
約瑟夫問題是乙個著名的趣題。這裡我們稍稍修改一下規則。有n個人站成一列。並從頭到尾給他們編號,第乙個人編號為1。然後從頭開始報數,第一輪依次報1,2,1,2.然後報到2的人出局。接著第二輪再從上一輪最後乙個報數的人開始依次報1,2,3,1,2,3.報到2,3的人出局。以此類推直到剩下以後乙個人。現在...