傳送門
這道題是用模擬,如果使用暴力的話,顯然需要3重迴圈,然後再寫乙個判斷條件。那麼我們就要從這三重迴圈下手進行優化,根據資料範圍可以知道總的時間複雜度大概是o(n)或者o(nlogn),那三重迴圈我們只能保留一重迴圈,觀察發現保留a陣列的迴圈和保留c陣列的迴圈本質是一樣的,但是如果保留a陣列的迴圈的話,b陣列和c陣列是有關聯的,寫程式就比較麻煩,可以發現當保留b陣列的時候,只需要找到a陣列中比它小的,c陣列中比它大的就行,a和c本身並無關聯。我們保留了b陣列的迴圈,接下來可以用字首和的方法來解決這道題,可以先定義乙個cnt陣列,cnt[i]記錄的是陣列a中小於等於i的數的數量(之所以能這樣寫,是因為資料範圍比較小),那麼cnt[b[i]-1],就是陣列a中所有比b[i]小的數的數量了,同理可以求出c陣列中所有比b[i]大的數的數量。最後每次將小於b[i]的數的數量和大於b[i]的數的數量相乘,然後累加,就得出答案了。
#include #include #include #include using namespace std;
const int maxn=1e5+7;
typedef long long ll;
int a[maxn],b[maxn],c[maxn],cnta[maxn],cntc[maxn];
int main()
for(int i=0;i
for(int i=0;i
for(int i=1;i
ll ans=0;
for(int i=0;i
//成ll,因為兩個1e5的數有可能爆int
cout<
return 0;
}
AcWing 1236 遞增三元組
原題鏈結 考察 雙指標 or 二分排序 or 字首和 思路 n 105 n2的時間複雜度也會超時,所以我們只能列舉乙個數,這就必須要利用乘法原理求得答案,已知題目要求 ai jk如果我們列舉aior ck可以發現無法省略其他層列舉,而我們列舉b,c與a就能利用乘法原理,找到小於bj與大於bj的數,兩...
遞增三元組
遞增三元組 描述給定三個整數陣列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,...
遞增三元組
給定三個整數陣列 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,...