hdu 1166 敌兵布阵
来源:互联网 发布:不用网络调频收音机 编辑:程序博客网 时间:2024/06/11 11:06
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1166
解题思路:
(1)Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
(4)End 表示结束。
可以用树状数组做,也可以用线段树做。。。
AC代码(树状数组):
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int n; int c[50005]; int lowbit(int x){ return x&(-x); } void add(int x,int val){ while(x <= n){ c[x] += val; x += lowbit(x); } } int sum(int x){ int ans = 0; while(x){ ans += c[x]; x -= lowbit(x); } return ans; } int main(){ int T,t = 1; scanf("%d",&T); while(T--){ memset(c,0,sizeof(c)); int val; scanf("%d",&n); for(int i = 1; i <= n; i++){ scanf("%d",&val); add(i,val); } char op[10]; int a,b; printf("Case %d:\n",t++); while(1){ scanf("%s",op); if(op[0] == 'Q'){ scanf("%d%d",&a,&b); printf("%d\n",sum(b)-sum(a-1)); } else if(op[0] == 'A'){ scanf("%d%d",&a,&b); add(a,b); } else if(op[0] == 'S'){ scanf("%d%d",&a,&b); add(a,-b); } else break; } } return 0; }
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 50005;int n;int a[N];struct node{ int l,r,sum;}tree[N<<2];void build(int m,int l,int r){ tree[m].l = l; tree[m].r = r; if(l == r){ tree[m].sum = a[l]; return; } int mid = (l+r)>>1; build(m<<1,l,mid); build(m<<1|1,mid+1,r); tree[m].sum = tree[m<<1].sum+tree[m<<1|1].sum;}void update(int m,int a,int val){ if(tree[m].l == a && tree[m].r == a){ tree[m].sum += val; return; } int mid = (tree[m].l+tree[m].r)>>1; if(a <= mid) update(m<<1,a,val); else update(m<<1|1,a,val); tree[m].sum = tree[m<<1].sum+tree[m<<1|1].sum;}int query(int m,int l,int r){ if(tree[m].l == l && tree[m].r == r) return tree[m].sum; int mid = (tree[m].l+tree[m].r)>>1; if(r <= mid) return query(m<<1,l,r); else if(l > mid) return query(m<<1|1,l,r); return query(m<<1,l,mid)+query(m<<1|1,mid+1,r);}int main(){ int T,t = 1; scanf("%d",&T); while(T--){ int val; scanf("%d",&n); for(int i = 1; i <= n; i++) scanf("%d",&a[i]); build(1,1,n); char op[10]; int a,b; printf("Case %d:\n",t++); while(1){ scanf("%s",op); if(op[0] == 'Q'){ scanf("%d%d",&a,&b); printf("%d\n",query(1,a,b)); } else if(op[0] == 'A'){ scanf("%d%d",&a,&b); update(1,a,b); } else if(op[0] == 'S'){ scanf("%d%d",&a,&b); update(1,a,-b); } else break; } } return 0;}
0 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 敌兵布阵
- POJ 1061 青蛙的约会(拓展欧几里得)
- uva 11536Smallest Sub-Array
- vagrant 学习
- jvm(1)----java内存区域与内存溢出异常
- AES 对称加密算法 加密\解密实例
- hdu 1166 敌兵布阵
- Java中Class.forName和ClassLoader.loadClass的区别
- hdu 4605(树状数组+离散化)
- 两种方法实现:输入一个链表,从尾到头打印链表每个节点的值
- hello world!
- css 之殇
- CSU 1542 Flipping Parentheses(线段树)
- nslookup工具
- Mac OS安装使用docker