https://www.acmicpc.net/problem/18917
시간 제한 | 메모리 제한 | solved.ac 티어 |
2초 | 256MB | 실버 4 |
문제
처음에 0이 하나 포함되어있는 배열 A가 있다. 이때, 다음 쿼리를 수행해야 한다.
- 1 x: A의 가장 뒤에 x를 추가한다.
- 2 x: A에서 x를 제거한다. A에 x가 두 개 이상 있는 경우에는 가장 앞에 있는 하나만 제거한다. 항상 A에 x가 있는 쿼리만 주어진다.
- 3: A에 포함된 모든 원소를 더한 값을 출력한다.
- 4: A에 포함된 모든 원소를 XOR한 값을 출력한다.
입력
첫째 줄에는 쿼리의 개수 M이 주어진다. 둘째 줄부터 다음 M 개의 줄에 쿼리가 주어진다.
출력
3번 혹은 4번 쿼리가 등장할 때마다, 답을 한 줄에 하나씩 출력한다.
제한
- 1 ≤ M ≤ 500 000
- 1 ≤ x ≤ 1 000 000 000
- 3번 혹은 4번 쿼리가 적어도 하나 주어진다.
구현하는 문제이다. 다만 입력받은 숫자들의 합과 XOR연산만이 궁금하므로, 기존의 모든 값을 저장할 필요가 없다. 그리고 XOR연산은 교환법칙과 결합법칙이 성립하기 때문에, 쿼리1로 추가된 x값을 xor연산하고, 쿼리2로 x가 들어오더라도, 기존의 xor연산값에서 x를 한번 더 xor연산하면 된다.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main () {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int query, x, test_case;
ll xor_val = 0;
ll sum = 0;
cin >> test_case;
while(test_case--) {
cin >> query;
if (query == 1){
cin >> x;
sum += x;
xor_val ^= x;
}
else if (query == 2){
cin >> x;
sum -= x;
xor_val ^= x;
}
else if (query == 3){
cout << sum << '\n';
}
else if (query == 4){
cout << xor_val << '\n';
}
}
}
'coding_test > BAEKJOON' 카테고리의 다른 글
백준 11047번 C++ 풀이 (0) | 2022.02.02 |
---|---|
백준 5397번 C++ 풀이 (0) | 2022.02.02 |
백준 2343번 C++ 풀이 (0) | 2022.01.26 |
백준 4796번 C++ 풀이 (0) | 2022.01.26 |
백준 2870번 C++ 풀이 (0) | 2022.01.25 |