고전 알고리즘 | 2 차원 트 리 배열
2 차원 트 리 배열 을 사용 할 수 있 습 니 다.
먼저 lowBit (n) 입 니 다. 이 함수 의 기능 은 n 의 가장 낮은 1 이 대표 하 는 수의 크기 를 되 돌려 주 는 것 입 니 다. 예 를 들 어 5, 2 진법 이 101 이면 가장 낮은 1 은 1 입 니 다. 2 진법 101000 에 있어 가장 낮은 1 은 1000 이 고 lowBit 는 두 가지 실현 방식 이 있 습 니 다. 하 나 는 n – (n & (n – 1) 이 고 두 번 째 는 n & (n) 이 며 두 번 째 는 n & (n) 입 니 다. 두 번 째 로 이용 하 는 패 치 의 성질 입 니 다.이 두 가지 방식 의 결 과 는 사실 같다.
여기에 보조 배열 tree 를 사용 합 니 다.list,tree_list [n] 은 treelist[n] + tree_list[n-1]+。。。tree_list [n – lowBit (n)], 1 차원 상황 입 니 다. 2 차원 treelist 는 2 차원 이 고 원 리 는 같다.
num [x] 를 수정 할 때, 모든 n > x, n – lowBit (n) < x 의 n, 그 treelist [n] 은 모두 수정 이 필요 합 니 다. for (int i = x, i < = size (), i + = lowBit (i) 를 사용 하면 size () 보다 작은 요 구 를 만족 시 키 는 n 을 찾 을 수 있 습 니 다. 이것 은 1 차원 처리 이 고 2 차원 처리 방식 은 같 습 니 다.
여 기 는 x 대표 줄 수, y 대표 열 수 를 주의해 야 합 니 다. 줄 이 옮 겨 다 니 거나 열 이 옮 겨 다 닐 때 for 순환 조건 에 주의해 야 합 니 다. 또한 숫자 세그먼트 를 조회 할 때 1 을 줄 이 는 문 제 를 주의해 야 합 니 다.
#include
using namespace std;
int tree_list[1001][1001] = { 0 };
int lowBit(int x)
{
return x & (-x);
}
int search(int x, int y)
{
int result = 0;
for (int i = x; i > 0; i -= lowBit(i))
for (int j = y; j > 0; j -= lowBit(j))
result += tree_list[i][j];
return result;
}
void add(int x, int y, int value, int w,int h)
{
for (int i = x; i <= h; i += lowBit(i))
for (int j = y; j <= w; j += lowBit(j))
tree_list[i][j] += value;
}
int main()
{
int num[][6] = {
{0, 0, 0, 0, 0, 0},
{0, 1, 2, 3, 4, 5},
{0, 6, 7, 8, 1, 1},
{0, 6, 7, 8, 1, 1 },
{0, 1, 1, 1, 1, 1 }
};
int h = 4;
int w = 5;// 1
for(int i=1;i<=h;i++)
for (int j = 1; j <= w; j++)
{
add(i, j, num[i][j], w, h);
}
char j_type = 'a';
int x, y, v;
int x2, y2;
while (cin >> j_type)
{
if (j_type == 'a')
{
cin >> x >> y >> v;
add(x, y, v, w, h);
}
else
{
cin >> x >> y >> x2 >> y2;
int A1, A2, A3, A4;
A1 = search(x-1, y-1);
A2 = search(x2, y2);
A3 = search(x-1, y2);
A4 = search(x2, y-1);
cout << A2 - A3 - A4 + A1 << endl;
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 면접 문제 고전 20 예 [시즌 3 상서 붕]8. Overload 와 Override 의 차이.Overloaded 방법 은 반환 값 의 종 류 를 바 꿀 수 있 습 니까?방법의 재 작성 Overriding 과 과부하 Overloading 은 자바 다 형 적 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.