給定三個整數陣列
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,...