https://www.acmicpc.net/problem/16713
16713번: Generic Queries
첫째 줄에는 $N, Q$가 공백을 사이에 두고 주어진다. ($1 \le N \le 10^6$, $1 \le Q \le 3 \cdot 10^6$) 둘째 줄에는 $a_1, a_2, \cdots a_N$이 공백을 사이에 두고 주어진다. ($0 \le a_i \le 10^9$) 그 후, $Q$개의 줄에 걸
www.acmicpc.net
XOR 연산은 다시 XOR연산을 해주면 이전 값으로 돌아갈 수 있다.
1011
0101
-----
1110
0101
-----
1011
그 이유는 같은 것을 XOR하면 0이 나오고
a^b^a = a^a^b = 0^b=b이기 때문이다.
import java.util.*;
import java.io.*;
public class Main
{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input1 = br.readLine().split(" ");
String[] input2 = br.readLine().split(" ");
Integer[] sum = new Integer[Integer.valueOf(input1[0])+1];
Integer[] result = new Integer[Integer.valueOf(input1[1])];
sum[0]=0;
for(int i=0; i<Integer.valueOf(input1[0]);i++){
sum[i+1] = sum[i]^Integer.valueOf(input2[i]);
}
// System.out.println(Arrays.toString(sum));
for(int i=0; i<Integer.valueOf(input1[1]);i++){
String[] input3 = br.readLine().split(" ");
int start=Integer.valueOf(input3[0]);
int end=Integer.valueOf(input3[1]);
result[i] = sum[end]^sum[start-1];
}
// System.out.println(Arrays.toString(result));
int ans=0;
for(int i =0; i<Integer.valueOf(input1[1]);i++){
ans = ans^Integer.valueOf(result[i]);
}
System.out.println(ans);
}
}
같은 로직이지만 더 깔끔하게
import java.util.Scanner;
class Main
{
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int[] arr = new int[N + 1];
for (int i = 1; i <= N; i++)
arr[i] = sc.nextInt();
int[] acc = new int[N + 1];
for (int i = 1; i <= N; i++)
acc[i] = acc[i - 1] ^ arr[i];
int ans = 0;
while (M-- > 0) {
int i = sc.nextInt();
int j = sc.nextInt();
ans ^= acc[j] ^ acc[i - 1];
}
System.out.println(ans);
}
}
'Problem Solving > 구간합' 카테고리의 다른 글
BOJ2295 세 수의 합 (1) | 2024.02.14 |
---|---|
BOJ17232 생명게임* (1) | 2024.02.11 |
BOJ 19951 태상이의 훈련소 생활 (0) | 2024.02.09 |
BOJ11660 구간 합 구하기 5(R) * (0) | 2024.02.09 |
구간 합 구하기 개념 (0) | 2024.02.08 |