
Educational Codeforces Round 115 (Rated for Div. 2)-C. Delete Two Elements
falconlee236
·2021. 11. 16. 20:12
문제 설명
모노폴리는 정수
모노폴리는 정확히 배열
우리가 해야할 것은 만약 두 숫자를 지워도 여전히 평균이
Input
첫번째 줄에는 테스트 케이스의 개수를 나타내는 정수
각 테스트케이스의 첫번째 줄에는 배열에 있는 원소의 수
각 테스트케이스의 두번째 줄에는 배열에 있는 정수
Output
각 테스트케이스 두 원소를 지워서 얻은
Example
input
4
4
8 8 8 8
3
50 20 10
5
1 4 7 3 5
7
1 2 3 4 5 6 7
output
6
0
2
3
문제 접근
사용한 알고리즘: 수학, 자료구조, 구현
걸린 시간 : 00:06
온몸 비틀면서 겨우겨우 binary_search, lower_bound, upper_bound를 이용해서 대회 종료 5분전에 풀었는데 문제 해설을 보니 well-known문제라고 한다. 실제로 고수들의 풀이를 보니까 다 비슷비슷 하더라. 이 문제에서 구하는 방식은 앞으로 고수들의 well-known풀이를 이용해서 쉽게쉽게 풀어보자.
일단 간단한 수학을 해야한다.
이 식을
우리가 마지막으로 해야할 일은 두 수를 더해서
우리는 배열의 한 원소를
정답 코드
#include <iostream>
#include <map>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while(t--){
int n; cin >> n;
int arr[n];
long long sum = 0;
for(int i = 0; i < n; i++){
cin >> arr[i];
sum += arr[i] * 1LL;
}
if((sum << 1) % n != 0){
cout << 0 << "\n";
continue;
}
map<long long, int> mp;
long long p = (sum << 1) / n;
long long ans = 0;
for(int i = 0; i < n; i++){
ans += mp[p - arr[i]];
mp[arr[i]]++;
}
cout << ans << "\n";
}
return 0;
}