Hdu - 1166 적군 포진 【 선분 수 (단점 갱신) 】

1764 단어 treequeryBuild
제목 링크:http://acm.hdu.edu.cn/showproblem.php?pid=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; }

좋은 웹페이지 즐겨찾기