【树状数组初探第二弹】HDU 1166题解——敌兵布阵
2013-01-25 14:24
274 查看
来源:点击打开链接
这个题有两种解法,树状数组&线段树,当然这也是这种题目的通常状况,线段树和划分树普适性更强一些,但线段树显然更简单,比如我印象深刻的有2012长春赛区区域网络赛的第一道题,快速的做法是用一个三维的树状数组,无解的怨念啊。。
这个题没什么要注意的,寻找第I到J个的和也很简单,用find_add(J)-find_add(I-1)就行了。。。。这两道题很适合初学者了解树状数组。
感觉最主要的便是神奇的lowbit函数了,类似的讲解网上遍地都是,不多说了。。
这个题有两种解法,树状数组&线段树,当然这也是这种题目的通常状况,线段树和划分树普适性更强一些,但线段树显然更简单,比如我印象深刻的有2012长春赛区区域网络赛的第一道题,快速的做法是用一个三维的树状数组,无解的怨念啊。。
这个题没什么要注意的,寻找第I到J个的和也很简单,用find_add(J)-find_add(I-1)就行了。。。。这两道题很适合初学者了解树状数组。
感觉最主要的便是神奇的lowbit函数了,类似的讲解网上遍地都是,不多说了。。
#include <iostream> #include <stdio.h> #include <cstring> using namespace std; int c[50005]; int N; int lowbit(int x) { return x&(-x); } int query_add(int x) { int result=0; for(int i=x;i>0;i-=lowbit(i)) { result+=c[i]; } return result; } void modify_add(int pos,int delta) { for(int i=pos;i<=N;i+=lowbit(i)) { c[i]+=delta; } } void modify_sub(int pos,int delta) { for(int i=pos;i<=N;i+=lowbit(i)) { c[i]-=delta; } } int main() { int testcase; char a[30]; scanf("%d",&testcase); for(int p=1;p<=testcase;p++) { memset(c,0,sizeof(c)); int packnum,x,y; scanf("%d",&packnum); N=packnum; for(int i=1;i<=packnum;i++) { int temp; scanf("%d",&temp); modify_add(i,temp); } printf("Case %d:\n",p); while(true) { scanf("%s",&a); if(a[0]=='E') break; else if(strcmp("Query",a)==0) { scanf("%d%d",&x,&y); printf("%d\n",query_add(y)-query_add(x-1)); } else if(strcmp("Add",a)==0) { scanf("%d%d",&x,&y); modify_add(x,y); } else if(strcmp("Sub",a)==0) { scanf("%d%d",&x,&y); modify_sub(x,y); } } } return 0; }
相关文章推荐
- HDU 1166 敌兵布阵 题解与分析 (普通线段树,ZKW线段树实现)
- hdu1166敌兵布阵(线段树---单点更新,区间求值)
- hdu 1166 敌兵布阵 (线段树初步)
- HDU 1166 敌兵布阵
- hdu 1166 敌兵布阵 线段树
- hdu(1166)——敌兵布阵(更新节点,区间求和)
- HDU 1166 敌兵布阵 线段树
- hdu 1166 敌兵布阵 线段树
- hdu 1166 敌兵布阵 (线段树)
- HDU-1166敌兵布阵
- hdu 1166 敌兵布阵 单点更新模板
- hdu 1166 敌兵布阵 (树状数组)
- HDU 1166 敌兵布阵
- 敌兵布阵 HDU - 1166 ----------线段树
- hdu 1166 敌兵布阵(线段树基础题)
- hdu 1166 敌兵布阵 解题报告
- HDU 1166-敌兵布阵【树状数组&&线段树单点更新】【模板】
- HDU 1166 敌兵布阵 树状数组
- HDU-1166 敌兵布阵【简单线段树-单点更新+区间查询】
- HDU 1166 敌兵布阵