HDU_1166 敌兵布阵 【线段树】
2018-03-02 12:39
330 查看
题目链接
Add:第i个坐标加上j
Sub:第i个坐标减去j
Query:查询i到j区间的和
题目描述
给定一个区间,在区间上有三个操作。Add:第i个坐标加上j
Sub:第i个坐标减去j
Query:查询i到j区间的和
解题思路
数据范围过大,暴力肯定撞墙,线段树问题,单点更新求区间和,线段树的入门模板题。代码部分
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #define lc left, mid, root << 1 #define rc mid + 1, right, root << 1 | 1 using namespace std; const int maxn = 5e4 + 10; int sum[maxn << 2]; void push_up(int root) { sum[root] = sum[root << 1] + sum[root << 1 | 1]; } void build(int left, int right, int root) { if(left == right) { scanf("%d", &sum[root]); return; } int mid = (left + right) >> 1; build(lc); build(rc); push_up(root); } void update(int left, int right, 4000 int root, int a, int b) { if(left == right) { sum[root] += b; return; } int mid = (left + right) >> 1; if(a <= mid) update(lc, a, b); else update(rc, a, b); push_up(root); } int query(int left, int right, int root, int a, int b) { if(a <= left && right <= b) { return sum[root]; } int mid = (left + right) >> 1; int ans = 0; if(b <= mid) ans += query(lc, a, b); else if(a > mid) ans += query(rc, a, b); else { ans += query(lc, a, b); ans += query(rc, a, b); } return ans; } int main() { int t, n, m, a, b, cas = 0; scanf("%d", &t); while(t --) { printf("Case %d:\n", ++ cas); scanf("%d", &n); build(1, n, 1); while(1) { char c[55]; scanf("%s", c); if(!strcmp(c, "End")) break; scanf("%d%d", &a, &b); if(!strcmp(c, "Add")) { update(1, n, 1, a, b); } else if(!strcmp(c, "Sub")) { update(1, n, 1, a, -b); } else { int ans = query(1, n, 1, a, b); printf("%d\n",ans); } } } return 0; }
相关文章推荐
- hdu 1166 敌兵布阵_线段树
- hdu 1166 敌兵布阵(线段树,树状数组)
- HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>
- HDU 1166 敌兵布阵【线段树 单点更新】
- hdu 1166 敌兵布阵(线段树,单点更新)
- HDU 1166-敌兵布阵(线段树单节点更新)
- HDU 1166 敌兵布阵 (树状数组和线段树解法)
- hdu_1166 敌兵布阵(线段树/分块)
- hdu1166 敌兵布阵 线段树
- hdu1166敌兵布阵 线段树
- HDU 1166 敌兵布阵(线段树)
- hdu1166敌兵布阵 (线段树)
- 数据结构 (线段树入门) HDU 1166 敌兵布阵(单点更新)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- HDU 1166 敌兵布阵 (树状数组·线段树)
- hdu 1166 敌兵布阵(线段树单点更新(a位置的值+/-b)+区间求和)
- HDU--1166敌兵布阵(线段树)
- HDU 1166-敌兵布阵(线段树:单点更新,区间求和)
- hdu 1166——敌兵布阵 (线段树)
- HDU 1166 敌兵布阵(线段树)