보자마자 알겠네요 전역변수들이 메모리에 배치될 때 운영체제 내부 메모리 할당 정책에 의해 연속된 메모리에 배치될 수 있는데(캐시히트 최적화 등 이유로) 지금 보니 4, 4, 4, 4*200004, 4 바이트 이렇게 연속된 메모리에 배치되어있고 while(idx 이 부분에서 200004번째 인덱스는 트리의 최대 인덱스 다음부분인데 배치순서로 봤을 때 tmp변수가 있는 부분입니다. 이 부분을 건드려서 오답이 났네요 while(idx while(idx
value++을 하면 펜윅트리에 저장되는 누적합이 강의 영상의 개념이랑 다르고 0 1 3 이렇게 있을 때 1 2 4 이렇게 되어도 구간들의 차이는 변하지 않으니 그냥 쓴거같은데 코드 처음보는 입장에서 강의개념이랑 다른데 이렇게 던져놓으면 이해하기가 굉장히 힙듭니다. sum (tree_cnt, 1 , value - 1 ) - sum (tree_sum, 1 , value - 1 ); 이 부분에서 value-1을 하는데 9 13 18 이렇게 되어있고 value가 18일 때 13까지의 누적합이 아닌 17까지의 누적합을 구하는건데 비어있는 부분은 어차피 0으로 초기화 해서 상관없는 부분의 설명 없이 그냥 개념설명이랑 다른 가독성 떨어지는 코드만 뚝 있으면 어떻게 이해해야하나요? 직접 하나하나 그려보고 ai돌려봐야 겨우 이해가되네요
(1, 10) (2, 10) (3, 10) (4, 10) (5, 10) (6, 10) (7, 10) (8, 10) (9, 10) (10, 10) 이렇게 있었을 때 답은 45입니다. _y는 (-10, -10, -10, -10, -10, -10, -10, -10, -10, -10) ->-1을 곱했기 때문 이렇게 되고 이분 탐색 함수의 반환값 즉 이분탐색 진입 하자마자 mid값 바로 반환하여 idx는 무조건 4가 나옵니다. find_index의 반환값은 4이고 int idx = find_index(_y, a[i].second) + 1; 이 로직에 의해 idx는 5가 됩니다. 만약 i가 1이라고 했을 때 위의 예제에서 1 10보다 왼쪽에 있는건 0개인데 여기서는 일단 4개라고 치고 그냥 계산을 하는데 왜 이렇게 해도 맞는건지에 대한 설명이 부족한 것 같습니다. ret += 1LL * sum(idx);update(idx, 1); 결국 5를 9번 더하여 45로 결과는 맞는데 중복 y값을 왜 이렇게해도 맞는지에 대한 설명이 필요합니다.
아 제가 질문을 잘못드렸네요 제 코드가 완탐인 것 같아서 확인차 질문했었습니다 역시나 완탐이었군요 DP로 다시 풀어보겠습니다. 혹시 격자판의 크기가 n x n 이므로, 이동하는 것을 고려하면 -> 대각선으로 이동할 때 최소값인 2n-1 입니다. 하지만, 실제로는 가로 또는 세로로만 이동하는 경로도 고려해야 하므로, 경로의 최대 길이는 2n 보다 클 수 있습니다. 그래서 얼추... 3^32가 되는 것이죠. 이 부분이 이해가 잘 안갑니다 ㅜㅜ 혹시 추가 설명이 가능할까요?