藍橋杯 遞增三元組 兩種方法 字首和,二分

2021-10-04 23:01:48 字數 1674 閱讀 7581

題目鏈結

給定三個整數陣列

a = [a1, a2, … an],

b = [b1, b2, … bn],

c = [c1, c2, … cn],

請你統計有多少個三元組(i, j, k) 滿足:

1 <= i, j, k <= n

ai < bj < ck 輸入

第一行包含乙個整數n。

第二行包含n個整數a1, a2, … an。

第三行包含n個整數b1, b2, … bn。

第四行包含n個整數c1, c2, … cn。

輸出乙個整數表示答案

樣例

311

1222

333

27
提示

資料規模

對於30%的資料,1 <= n <= 100

對於60%的資料,1 <= n <= 1000

對於100%的資料,1 <= n <= 100000 0 <= ai, bi, ci <= 100000

解題思路:本題的乙個重點是要想到通過中間的陣列進行比較,找出a中比b大的,找出c中比b小的。具體來說有兩種方法,字首和,二分。都要注意的一點是儲存結果的變數要用long long

首先看字首和o(n)

#include

#include

using

namespace std;

int a[

100010]=

,b[100010]=

,c[100010]=

;int suma[

100010]=

,sumc[

100010]=

;int

main

(void

)for

(int i =

1;i <

100010

;i++

)for

(int i =

1;i <= n;i++

)scanf

("%d"

,&b[i]);

for(

int i =

1;i <= n;i++

)for

(int i =

1;i <

100010

;i++

)int ans =0;

for(

int i =

1;i <= n;i++

)printf

("%d"

,ans)

;return0;

}

二分o(nlogn)

這裡用到兩個函式,lower_bound找出a中第乙個大於等於當前b中元素的下標。upper_bound找出c中第乙個大於當前b中元素的下標.注意這兩個的區別。

#include

#include

#include

using

namespace std;

int a[

100010]=

,b[100010]=

,c[100010]=

;int

main

(void

) cout << ans;

return0;

}

藍橋杯 遞增三元組 字首和 模擬

題目描述 給定三個整數陣列 a a1,a2,an b b1,b2,bn c c1,c2,cn 請你統計有多少個三元組 i,j,k 滿足 1 i,j,k n ai輸入格式 第一行包含乙個整數 n。第二行包含 n 個整數 a1,a2,an。第三行包含 n 個整數 b1,b2,bn。第四行包含 n 個整數...

藍橋杯 遞增三元組

題目鏈結 直接暴力o n 3 o n 3 o n3 顯然超時。將三個陣列排序,遍歷b bb陣列,二分找到a aa中小於b i b i b i 的個數a aa,找到c cc中大於b i b i b i 的個數c cc,ans ansan s a c a ca c。時間複雜度,排序o n log n o...

藍橋杯 遞增三元組

給定三個整數陣列 a a1,a2,an b b1,b2,bn c c1,c2,cn 請你統計有多少個三元組 i,j,k 滿足 1.1 i,j,k n 2.ai bj 輸入格式 第一行包含乙個整數n。第二行包含n個整數a1,a2,an。第三行包含n個整數b1,b2,bn。第四行包含n個整數c1,c2,...