Hdu - 1166 적군 포진 【 선분 수 (단점 갱신) 】
문제 풀이 방향:
선분 트 리 의 입문 문 제 는 구 글 에서 선분 트 리 나 segment tree 를 검색 해 이해 하면 된다.
내 가 사용 하 는 것 은 정적 건축 이다.
코드 는 다음 과 같 습 니 다:
#include<cstdio>
#define lson l, m, root << 1
#define rson m + 1, r, root << 1 | 1
const int N = 50005;
int segtree[N << 2]; // 4
void PushUp(int root) //
{
segtree[root] = segtree[root << 1] + segtree[root << 1 | 1];
}
void Build_Tree(int l, int r, int root) //
{
if(l == r)
{
scanf("%d", &segtree[root]);
return ;
}
int m = (l + r) >> 1;
Build_Tree(lson);
Build_Tree(rson);
PushUp(root);
}
void Update(int pos, int data, int l, int r, int root) //
{
if(l == r)
{
segtree[root] += data;
return ;
}
int m = (l + r) >> 1;
if(pos <= m) Update(pos, data, lson);
else Update(pos, data, rson);
PushUp(root);
}
int Query(int L, int R, int l, int r, int root) //
{
int sum = 0;
if(L <= l && r <= R) //
return segtree[root];
int m = (l + r) >> 1;
if(L <= m)
sum += Query(L, R, lson);
if(R > m)
sum += Query(L, R, rson);
return sum;
}
int main()
{
int ncase;
int num;
char ope[10];
int a, b;
scanf("%d", &ncase);
for(int i = 1; i <= ncase; ++i)
{
printf("Case %d:
", i);
scanf("%d", &num);
Build_Tree(1, num, 1);
while(~scanf("%s", ope))
{
if(ope[0] == 'E')
break;
scanf("%d %d", &a, &b);
if(ope[0] == 'A')
Update(a, b, 1, num, 1);
else if(ope[0] == 'S')
Update(a, -b, 1, num, 1);
else
printf("%d
", Query(a, b, 1, num, 1));
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
이진 트리 가지치기이진 트리의 root가 주어지면 1을 포함하지 않는 (지정된 트리의) 모든 하위 트리가 제거된 동일한 트리를 반환합니다. 노드node의 하위 트리는 node에 node의 자손인 모든 노드를 더한 것입니다. 이 문제는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.