雑記・まとめ

個人的な備忘録

arc084_a

少し紙に書いて考えたら、なるほどーって閃いた問題

 

 

中部を基準として決め打ちすると

・基準より小さいものを上部から選ぶ

・基準より大きいものを下部から選ぶ

というそれぞれの二分探索を行えば作れる祭壇のパターン数が分かる

あとは全中段のパターン数を足せばOK

 

#include<bits/stdc++.h>
using namespace std;

int n;
int a[100009], b[100009], c[100009];

int solve1(int p){

int ok = -1;
int ng = n;
while(abs(ok-ng)>1){
int mid = (ok+ng)/2;
if(a[mid] < p) ok = mid;
else ng = mid;
}

return ok;
}

int solve2(int p){

int ng = -1;
int ok = n;
while(abs(ok-ng)>1){
int mid = (ok+ng)/2;
if(p < c[mid]) ok = mid;
else ng = mid;
}

return ok;
}
int main(){

cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
for(int i=0;i<n;i++) cin >> b[i];
for(int i=0;i<n;i++) cin >> c[i];

sort(a, a+n);
sort(b, b+n);
sort(c, c+n);

long long int cnt = 0;
for(int i=0;i<n;i++){
long long int j = solve1(b[i]);
long long int k = solve2(b[i]);
cnt += (j+1) * (n-k);
//cout << i << " " << j << " " << k << endl;
}

cout << cnt << endl;
}