PS

BOJ 30961 : 최솟값, 최댓값

lickelon 2024. 3. 20. 22:59
  • 문제 링크 : 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$일때만 답에 영향을 주는 것을 알 수 있다.

'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