HDU_1166_线段树
来源:互联网 发布:诸葛亮北伐的战略 知乎 编辑:程序博客网 时间:2024/05/17 00:50
题意:给你一个数列,让你维护一个区间询问和区间查询,线段树或者树状数组:
1.线段树代码:
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int N =50000 + 100;int sum[N<<2];void bulid(int l, int r, int rt){ if(l == r) { scanf("%d", &sum[rt]); return ; } int m = (l+r) >> 1, rtt = rt << 1; bulid(l, m, rtt); bulid(m+1, r, rtt+1); sum[rt] = sum[rtt] + sum[rtt+1];}void update(int p, int add, int l, int r, int rt){ if(l == r) { sum[rt] += add; return ; } int m = (l+r) >> 1, rtt = rt << 1; if(p <= m) update(p, add, l, m, rtt); else update(p, add, m+1, r, rtt+1); sum[rt] = sum[rtt] + sum[rtt+1];}int query(int L, int R, int l, int r, int rt){ if(L<=l && r<=R) { return sum[rt]; } int m = (l+r)>>1, rtt = rt<<1, ans = 0; if(L <= m) ans += query(L, R, l, m, rtt); if(R > m) ans += query(L, R, m+1, r, rtt+1); return ans;}int main(){ int t, n, a, b; char str[20]; scanf("%d", &t); for(int i=1; i<=t; ++i) { printf("Case %d:\n", i); scanf("%d", &n); bulid(1, n, 1); while(scanf("%s", str)) { if(str[0] == 'E') break; if(str[0] == 'A') scanf("%d%d", &a, &b), update(a, b, 1, n, 1); else if(str[0] == 'Q') scanf("%d%d", &a, &b), printf("%d\n", query(a, b, 1, n, 1)); else if(str[0] == 'S') scanf("%d%d", &a, &b), update(a, -b, 1, n, 1); } } return 0;}
2.树状数组代码:
#include <iostream>#include <string>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;int a[50001], c[50001];int n;int lowBit(int x){ return x&(-x);}void Update(int pos, int delta){ while(pos <= n) { c[pos] += delta; pos += lowBit(pos); }}int getresult(int pos){ int sum = 0; while(pos > 0) { sum += c[pos]; pos -= lowBit(pos); } return sum;}void Build(){ for(int i=1; i<=n; ++i) { scanf("%d", &a[i]); Update(i, a[i]); }}int main(){ int T, i, j, a, b; char s[10]; scanf("%d", &T); for(i=1; i<=T; ++i) { memset(c, 0, sizeof(c)); scanf("%d", &n); Build(); printf("Case %d:\n", i); while(scanf("%s", s) && s[0] != 'E') { scanf("%d%d", &a, &b); if(s[0] == 'A') Update(a, b); else if(s[0] == 'S') Update(a, -b); else printf("%d\n", getresult(b)-getresult(a-1)); } } return 0;}
0 0
- hdu_1166_线段树模板
- HDU_1166_线段树
- HDU_1166_敌兵布阵(线段树OR树状数组)
- hdu_1166_线段树_单点更新_区间求和
- HDU_1166_敌兵布阵
- HDU_1166_敌兵布阵
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 密码保存在Keychan比NSUserDefaults里的优点 (Touch ID以及1Password)
- 技术blog06 by 八戒
- lager_transform未定义错误
- maven学习
- 一共81个,开源大数据处理工具汇总
- HDU_1166_线段树
- Android L(Android 5.0) 系统主色调
- 谷歌偏转库一个类
- JavaWeb-06(Dom4j技术及Schema 约束、Tomcat与Web程序结构)
- 《三体》阅读笔记
- iOS —— NSRunLoop(二)关于NSTimer的理解
- 项目-不要因为项目小就不制定计划
- Roope的Cocos2d-x学习之旅 002:简简单单的运动
- Django模板系统