- 문제 링크 : boj.kr/30961
- 난이도 : G4
- 태그 : 정렬, 애드혹, 조합론
30961번: 최솟값, 최댓값
수열의 힘은 수열의 최솟값과 최댓값을 곱한 값이다. 길이가 $N$인 수열 $A$가 주어질 때, 이 수열에서 길이가 $1$ 이상인 모든 부분수열 각각의 힘을 구하여 모두 XOR한 값을 구하여라.
www.acmicpc.net
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
vector<ll> arr(n);
for(auto &u : arr) cin >> u;
sort(all(arr));
ll ans = 0;
for(int i = 0; i < n; i++) {
ans ^= arr[i]*arr[i];
}
for(int i = 0; i < n-1; i++) {
ans ^= arr[i]*arr[i+1];
}
cout << ans;
return 0;
}
풀이
부분 수열의 최댓값, 최솟값을 이용하는 문제이므로 정렬을 해도 상관이 없다.
정렬을 하고 관찰을 해보자.
최솟값이 $A_i$이고 최댓값이 $A_j$인 부분 수열이 $2^{j-i-1}$개가 생기는 것을 알 수 있다.
$(A \oplus X) \oplus X = A$인 성질을 이용하면 $j=i+1$일때와 $j=i$일때만 답에 영향을 주는 것을 알 수 있다.
728x90
'PS' 카테고리의 다른 글
BOJ 7569 : 토마토 (0) | 2024.03.22 |
---|---|
BOJ 7576 : 토마토 (0) | 2024.03.21 |
BOJ 11108 : TV 전쟁 (0) | 2024.03.19 |
BOJ 30878 : 약속 시간 (0) | 2024.03.18 |
BOJ 24337 : 가희와 탑 (0) | 2024.03.17 |