hdu 1166 树状数组 线段树
来源:互联网 发布:苏州迈科网络 公告 编辑:程序博客网 时间:2024/05/22 17:56
一道线段树和树状数组的基础题
用树状数组做:
#include<iostream>using namespace std;#define N 50010int size,c[N];int lowbit(int x){return x&(-x);}void modify(int i,int x){while(i <= size){c[i] += x;i += lowbit(i);}}int sum(int i){int ans = 0;while(i > 0){ans += c[i];i -= lowbit(i);}return ans;}int main(){int t,total = 1;scanf("%d",&t);char str[10];while(t--){memset(c,0,sizeof(c)); //每次输入一组新的数据之前都要把数组c 置0scanf("%d",&size);int a,b,c,i;for(i = 1;i <= size;i++){scanf("%d",&c);modify(i,c);}printf("Case %d:\n",total++);while(scanf("%s",str)&&str[0] != 'E'){scanf("%d%d",&a,&b);switch(str[0]){ case 'Q': printf("%d\n",sum(b) - sum(a-1)); break; case 'A': modify(a,b); break; case 'S': modify(a,-b); break;}}}return 0;}
用线段树做:
#include<iostream>using namespace std;#define N 50010struct node{int left,right;int sum;}tree[N*4];int num[N];void build(int l,int r,int i){tree[i].left = l;tree[i].right = r;if(l == r){tree[i].sum = num[l];return ;}int mid = (l+r)>>1;build(l,mid,i*2);build(mid+1,r,i*2+1);tree[i].sum = tree[i*2].sum + tree[i*2+1].sum;}void modify(int l,int r,int v,int i){if(tree[i].left == l&&tree[i].right == r){tree[i].sum += v;return ;}int mid = (tree[i].left + tree[i].right)>>1;if(r <= mid)modify(l,r,v,i*2);else if(l > mid)modify(l,r,v,i*2+1);else {modify(l,mid,v,i*2);modify(mid+1,r,v,i*2+1);}tree[i].sum = tree[i*2].sum + tree[i*2+1].sum;}int query(int l,int r,int i){if(l == tree[i].left&&r == tree[i].right)return tree[i].sum;int mid = (tree[i].left + tree[i].right)>>1;if(r <= mid)return query(l,r,i*2);else if(l > mid)return query(l,r,i*2+1);elsereturn query(l,mid,i*2) + query(mid+1,r,i*2+1);}int main(){int t,total = 1;scanf("%d",&t);while(t--){int n;char str[20];scanf("%d",&n);int i,a,b;for(i = 1;i <= n;i++)scanf("%d",num+i);build(1,n,1);printf("Case %d:\n",total++);while(scanf("%s",str)&&str[0] != 'E'){scanf("%d%d",&a,&b); //不用加 getchar() 如果str 是字符则需要 字符串不需要switch(str[0]){ case 'Q': printf("%d\n",query(a,b,1)); break; case 'A': modify(a,a,b,1); break; case 'S': modify(a,a,-b,1); break;}}}return 0;}
- 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 敌兵布阵(树状数组和线段树)
- 访问图像元素(imagedata widthstep)
- 2011-8-7 17:52:56
- 2011-8-7 18:06:30
- 关闭整个FRAMESET窗口的问题
- android设置Activity背景色为透明的2种方法
- hdu 1166 树状数组 线段树
- Begin from C++
- NSOperationQueue的简单应用
- 如何查看本电脑ASP.NET的版本?
- ACMSTEP 1.2.3 QuickSum //超级水题 模拟
- JSTL-XML处理
- lunwen 思绪 网页设计师 浅析网页设计中的构图技巧,内容很实用
- Extjs 中fields和grid的columns如何动态生成
- Linux下如何测试及使用USB转串口线