poj 3468__A Simple Problem with Integers(区间求和,成段更新)
2015-08-14 10:34
441 查看
链接:A Simple Problem with Integers
线段树的区间求和,成段更新模板题
代码如下
线段树的区间求和,成段更新模板题
代码如下
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; #define lson l , m , rt << 1 #define rson m+1 , r , rt << 1 | 1 #define ll long long const int maxn=100000+10; ll sum[maxn << 2], add[maxn << 2]; void Pushup(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } void Pushdown(int rt, int m) //m表示rt节点代表的区间长度 { if(add[rt]) { add[rt << 1] += add[rt]; add[rt << 1 | 1] += add[rt]; sum[rt << 1] += add[rt] * (m - (m >> 1)); //(m - (m >> 1))表示rt的左孩子增加(m - (m >> 1))个add[rt]; sum[rt << 1 | 1] += add[rt] * (m >> 1); add[rt] = 0; //处理完之后重置 } } void build(int l, int r, int rt) { add[rt] = 0; if(l == r) { scanf("%lld", &sum[rt]); return ; } int m = (r + l) >> 1; build(lson); build(rson); Pushup(rt); } ll query(int L, int R, int l, int r, int rt) { if(L <= l && R >= r) { return sum[rt]; } Pushdown(rt, r - l + 1); int m = (r + l) >> 1; ll ret = 0; if(L <= m) { ret += query(L, R, lson); } if(R > m) { ret += query(L, R, rson); } return ret; } void update(int L, int R, int c, int l, int r, int rt) { if(L <= l && R >= r) { add[rt] += c; sum[rt] += (ll)c * (r - l + 1); return ; } Pushdown(rt, r - l + 1); int m = (l + r) >> 1; if(L <= m) update(L, R, c, lson); if(m < R) update(L, R, c, rson); Pushup(rt); } int main() { int n, q, a, b, c; char s[2]; scanf("%d%d", &n, &q); //n个数,q次询问 build(1, n, 1); while(q--) { scanf("%s", s); if(s[0] == 'Q') { scanf("%d%d", &a, &b); printf("%lld\n", query(a, b, 1, n, 1)); } else if(s[0] == 'C') { scanf("%d%d%d", &a, &b, &c); update(a, b, c, 1, n, 1); } } return 0; }
相关文章推荐
- Git教程
- printf交替使用
- ASP.NET验证控件应用实例与详解。
- HDU 2222 Keywords Search(AC自动机)
- HDU 1255 覆盖的面积 (线段树 + 离散化 + 扫描线)
- Nginx+Resin+JSP+Memcached+MySQL安装配置整合
- POJ 1751 Highways(最小生成树prim)
- String StringBuffer和StringBuilder的区别
- LightOJ 1258 Making Huge Palindromes (回文&KMP)
- 在flash builder里全局搜索里如何“全字匹配”搜索
- js正则控制文本框只能输入数字以及小数
- 管式超滤系统:管式超滤膜技术在饮水净化中作用解析
- HttpClient Get和Post
- 别以为真懂Openstack系列:虚拟机创建的50个步骤和100个知识点
- 别以为真懂Openstack系列:虚拟机创建的50个步骤和100个知识点
- java: system.gc()和 finalize 的使用情景
- win10看视频总是弹出realtek高清晰音频管理器怎么办?
- 多线程六 经典线程同步之信号量Semaphore
- Gnome桌面的定制(修改面板 修改右键菜单) [初级]
- 进制转换