問題 F 對戰 II

2021-09-28 11:55:08 字數 1685 閱讀 4424

題目描述

在⼀條街道上有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的人出局。以此類推直到剩下以後乙個人。現在...