이 문제에서는 크기가 N인 배열 arr[]과 두 가지 유형이 가능한 Q 쿼리가 제공됩니다. 우리의 임무는 주어진 인덱스를 업데이트하고 범위에서 GCD를 찾는 쿼리를 해결하는 프로그램을 만드는 것입니다.
쿼리는 -
유형 1 − {1, index, value} - 주어진 인덱스의 요소를 값만큼 증가시킵니다.
유형 2 − {2, L, R} - 인덱스 범위 [L, R]에 있는 요소의 GCD를 찾습니다.
문제 설명 − [L, R] 범위에 있는 요소의 GCD를 찾아 값을 반환해야 합니다.
문제를 이해하기 위해 예를 들어보겠습니다.
입력
arr[] ={5, 1, 7, 3, 8}, Q =3쿼리:{{2, 2, 5}, {1, 3, 6}, {2, 2, 5}}사전>출력
설명
솔루션 접근 방식
문제를 해결하기 위한 접근 방식은 어레이에 대한 GCD를 전처리하는 데 사용되는 세그먼트 트리를 사용하는 것입니다. 이렇게 하면 각 쿼리에 대한 GCD를 계산하는 시간이 줄어듭니다.
세그먼트 트리 생성 및 작업
여기서 사용하는 세그먼트 트리는 배열의 요소를 리프 노드로 저장하고 요소의 GCD를 내부 노드로 저장하는 트리입니다.
우리 솔루션의 작동을 설명하는 프로그램
예시
#include네임스페이스 std;int calcGcdRangeRec(int* st, int segL, int segR, int L, int R, int currNode) { if (L <=segL &&R>=segR ) 반환 st[currNode]; if (segR R) 반환 0; 정수 중간 =(segL + (segR - segL)/2); int GcdL =calcGcdRangeRec(st, segL, mid, L, R, 2 * currNode + 1); int GcdR =calcGcdRangeRec(st, mid + 1, segR, L, R, 2 * currNode + 2); return __gcd(GcdL, GcdR);} 무효 updateArrayValueRec(int* st, int L, int R, int index, int diff, int currNode) { if (index R) return; st[currNode] =st[currNode] + diff; if (R !=L) { int mid =(L + (R - L)/ 2); updateArrayValueRec(st, L, mid, index, diff, 2 * currNode + 1); updateArrayValueRec(st, mid + 1, R, index, diff, 2 * currNode + 2); }}void updateArrayValue(int arr[], int* st, int n, int index, int newVal) { if (index <0 || index> n - 1) cout <<"Invalid Input"; else{ int diff =newVal - arr[인덱스]; arr[인덱스] =newVal; updateArrayValueRec(st, 0, n - 1, 인덱스, 차이, 0); }}int calcGcdRange(int* st, int n, int L, int R) { if (L <0 || R> n - 1 || L> R) { cout <<"잘못된 입력"; 반환 -1; } return calcGcdRangeRec(st, 0, n - 1, L, R, 0);}int constructGcdST(int arr[], int L, int R, int* st, int currNode) { if (L ==R) { st[currNode] =arr[L]; 반환 arr[L]; } 정수 중간 =(L + (R - L)/2); int GcdL =구성GcdST(arr, L, mid, st, currNode * 2 + 1); int GcdR =구성GcdST(arr, mid + 1, R, st, currNode * 2 + 2); st[currNode] =__gcd(GcdL, GcdR); return st[currNode];}int main() { int arr[] ={ 1, 3, 6, 9, 9, 11 }; 정수 n =sizeof(arr) / sizeof(arr[0]); 정수 Q =3; 정수 쿼리[3][3] ={{2, 1, 3}, {1, 1, 10}, {2, 1, 3}}; 정수 값 =(int)(ceil(log2(n))); 정수 크기 =2 * (int)pow(2, 값) - 1; int* st =새로운 int[크기]; 구성GcdST(arr, 0, n - 1, st, 0); for(int i =0; i 입력
쿼리 1:GCD는 3입니다. 쿼리 2:값 업데이트! 쿼리 3:GCD는 1입니다.