藍橋杯省賽之遞增三元組

2021-08-19 19:25:37 字數 1698 閱讀 9176

給定三個整數陣列

a = [a1,a2,... an], 

b = [b1,b2,... bn], 

c = [c1,c2,... cn] ,

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

1. 1 <= i,j,k <= n  

2. ai

【輸入格式】 

第一行包含乙個整數n 。

第二行包含ñ個整數a1,a2,...,an。

第三行包含ñ個整數b1,b2,... bn。

第四行包含ñ個整數c1,c2,... cn。

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

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

對於100%的資料,1 <= n <= 100000 0 <=艾,鉍,次<= 100000 

【輸出格式】

乙個整數表示答案

【樣例輸入】

3 1 1 1

2 2 2

3 3 3

【樣例輸出】

27 思路:當時就是三層暴力的,但是對於10萬的陣列規模n^2就會超時了,何況是三次方

接下來我整理下一位大佬的思路是o(n);

對於排好序的三個陣列

b陣列最為特別,因為乙個陣列要比它小,c陣列要比它大

那麼總和就是每個b中的元素在a陣列中小於這個元素的*在c陣列中大於b陣列這個元素的個數

翠花〜上**

#include#include#include#include#includeusing namespace std;

int n;//定義大小

#define maxn 100010//定義最大資料規模

long long sum=0;//定義最後的結果,因為可能是n^2所以說我們可以把他定義成long long

int a[maxn];//定義三個陣列中最小的那個

int b[maxn];//定義三個中中間的那個

int c[maxn];//定義三個中最大的那個

int t[maxn];//定義t陣列用來儲存在陣列a中小於b陣列中某個元素的元素個數

int main()

for(int i=0; i>b[i];

}for(int i=0; i>c[i];

}//對三個陣列從小到大排序

sort(a,a+n);

sort(b,b+n);

sort(c,c+n);

memset(t,0,sizeof(t));//初始化t陣列全部為0

int i=n-1;

int j=n-1;//a和b全部從後向前遍歷

while(i>=0&&j>=0)//如果兩個陣列全部沒有遍歷完,這裡說明下,如果i最後先<0那麼說明b陣列中某個元素比a陣列中所以元素都小,如果j先小於0,那麼就說明a陣列中某個元素比b陣列中的所有元素都小

else//如果不是的話

i--;//a陣列元素成更小變小看看還小不小於b[j];

}i=0;

j=0;//b,c陣列從前向後遍歷

while(jb[i])//如果c的第j個元素大於b的第i個元素那麼對於某個確定的b陣列中的元素b[i]在c陣列中就有n-j中可能因為c陣列中比j大的下標的元素一定也比b[i]大

else//如果小於的話找c的下乙個更大看大不大於b陣列的這個元素

j++;

}cout<}

藍橋杯 遞增三元組

題目鏈結 直接暴力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,...

藍橋杯題 遞增三元組

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