HDU-1166 敌兵布阵 线段树|树状数组
来源:互联网 发布:java开源微信商城 编辑:程序博客网 时间:2024/05/17 02:28
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
题意很简单~略
思路:纯粹的单点更新,线段树的入门题,当然,树状数组也很方便。
My code:
线段树版:
//STATUS:C++_AC_171MS_956KB #include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>#include<queue>#include<math.h>#include<map>#include<set>using namespace std;#define LL __int64#define pii pair<int,int>#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1const int MAX=50010,INF=200000000;const double esp=1e-6;void build(int l,int r,int rt);void update(int l,int r,int rt);void query(int l,int r,int rt);int num[MAX],sum[MAX*4];int T,n,a,b,ans;int main(){//freopen("in.txt","r",stdin);int i,k=1;char op[10];scanf("%d",&T);while(T--){printf("Case %d:\n",k++);scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&num[i]);build(1,n,1);while(scanf("%s",op) && op[0]!='E'){scanf("%d%d",&a,&b);if(op[0]!='Q'){if(op[0]=='S')b=-b;update(1,n,1);}else {ans=0;query(1,n,1);printf("%d\n",ans);}}}return 0;}void build(int l,int r,int rt){if(l==r){sum[rt]=num[l];return;}int mid=(l+r)>>1;build(lson);build(rson);sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void update(int l,int r,int rt){sum[rt]+=b;if(l==r)return;int mid=(l+r)>>1;if(a<=mid)update(lson);else update(rson);}void query(int l,int r,int rt){if(a<=l && r<=b){ans+=sum[rt];return;}int mid=(l+r)>>1;if(a<=mid)query(lson);if(b>mid)query(rson);}
树状数组版:
//STATUS:C++_AC_156MS_632KB #include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>#include<queue>#include<math.h>#include<map>#include<set>using namespace std;#define LL __int64#define pii pair<int,int>#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1const int MAX=50010,INF=200000000;const double esp=1e-6;int num[MAX],c[MAX];int T,n,a,b;int lowbit(int x){return x&(-x);}void update(int i){while(i<=n){c[i]+=b;i+=lowbit(i);}}int sum(int i){int s=0;while(i){s+=c[i];i-=lowbit(i);}return s;}int main(){//freopen("in.txt","r",stdin);int i,k=1;char op[10];scanf("%d",&T);while(T--){printf("Case %d:\n",k++);scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&num[i]);num[i]+=num[i-1];}for(i=1;i<=n;i++)c[i]=num[i]-num[i-lowbit(i)];while(scanf("%s",op) && op[0]!='E'){scanf("%d%d",&a,&b);if(op[0]!='Q'){if(op[0]=='S')b=-b;update(a);}else printf("%d\n",sum(b)-sum(a-1));}}return 0;}
- [hdu]1166敌兵布阵-线段树&树状数组
- HDU 1166 敌兵布阵(树状数组,线段树)
- HDU 1166 敌兵布阵 线段树/树状数组入门题
- hdu 1166 敌兵布阵 线段树&树状数组
- hdu 1166 敌兵布阵(水...线段树&&树状数组)
- hdu 1166 敌兵布阵 树状数组 线段树
- HDU-1166 敌兵布阵 线段树|树状数组
- HDU-1166 敌兵布阵(树状数组和线段树)
- hdu 1166敌兵布阵(树状数组or线段树)
- hdu 1166 敌兵布阵(线段树,树状数组)
- hdu 1166敌兵布阵(线段树或者树状数组)
- hdu 1166 敌兵布阵(树状数组 | 线段树)
- hdu 1166 敌兵布阵(线段树OR树状数组)
- HDU 1166 敌兵布阵 树状数组||线段树
- hdu 1166 敌兵布阵(树状数组 or 线段树)
- HDU-#1166 敌兵布阵 (树状数组&线段树)
- hdu 1166 敌兵布阵(数据结构:树状数组||线段树)
- hdu 1166 敌兵布阵 线段树和树状数组
- BufferedReader使用技巧转自freesky_lwj的博客
- 全世界最伤心的人 - 歌词
- CString 使用详解
- socket - 简述
- 英语练习 55 I like bright colors
- HDU-1166 敌兵布阵 线段树|树状数组
- 运行eclipse报JVM的错 解决方案
- 16进制的简单运算
- fodera linux view windows txt type files
- android gps经纬度实时更新,获取卫星数量
- poj 3528 & poj 2974 Ultimate Weapon(3D凸包求表面积)
- 安装openstack 遇到这样两个问题
- 中断系统练习题之中断应用
- 茵茵的第一课