hdu1166 敌兵布阵
来源:互联网 发布:淘宝新手如何做推广 编辑:程序博客网 时间:2024/05/19 13:22
http://acm.hdu.edu.cn/showproblem.php?pid=1166
这又是一道线段树的题目,,这是我做的第2道了
慢慢的懂得了一点线段树的只是了。。。。
我的代码:
#include <iostream>#include<cstdio>#include<cstring>using namespace std;#define maxn 500004struct node{ int left,right; int num;};node tree[3*maxn];int out=0;void build(int left,int right,int i){ tree[i].left =left; tree[i].right =right; tree[i].num =0; if(tree[i].left ==tree[i].right ) return ; build(left,(left+right)/2,2*i); build((left+right)/2+1,right,2*i+1);}void insert(int id,int i,int j)//i营地增加j个人{ if(tree[id].left<=i&&tree[id].right >=i) tree[id].num +=j; if(i>tree[id].right||i<tree[id].left ) return; int mid=(tree[id].left +tree[id].right )/2; if(i<=mid) insert(id*2,i,j); else insert(id*2+1,i,j);}void sum(int id,int i,int j) //问从i营地到j营地有多少人。。。{ int mid=(tree[id].left +tree[id].right )/2; if(tree[id].left ==i&&tree[id].right ==j) { out+=tree[id].num ; return; } if(j<=mid) sum(2*id,i,j); else if(i>mid) sum(2*id+1,i,j); else { sum(2*id,i,mid); sum(2*id+1,mid+1,j); }}int main(){ int t,n,num,l,r,Case=1; scanf("%d",&t); while(t--) { printf("Case %d:\n",Case++); scanf("%d",&n); build(1,n,1); for(int i=1;i<=n;i++) { scanf("%d",&num); insert(1,i,num); } char ss[20]; while(scanf("%s",ss)) { if(ss[0]=='E') break; if(ss[0]=='Q') { scanf("%d%d",&l,&r); sum(1,l,r); printf("%d\n",out); out=0; } if(ss[0]=='A') { scanf("%d%d",&l,&r); insert(1,l,r); } if(ss[0]=='S') { scanf("%d%d",&l,&r); insert(1,l,-r); } } } return 0;}
0 0
- hdu1166 敌兵布阵
- hdu1166 敌兵布阵
- HDU1166 敌兵布阵
- hdu1166 敌兵布阵
- hdu1166 敌兵布阵
- hdu1166(敌兵布阵)
- HDU1166:敌兵布阵
- hdu1166敌兵布阵
- HDU1166--敌兵布阵
- HDU1166 敌兵布阵
- hdu1166 敌兵布阵
- hdu1166 敌兵布阵
- hdu1166敌兵布阵
- hdu1166敌兵布阵
- hdu1166 敌兵布阵
- HDU1166 敌兵布阵
- hdu1166 敌兵布阵
- hdu1166敌兵布阵
- 调试工具 Postman 使用说明
- utf-8编码
- C语言
- redis 主从复制
- 关于lsnrctl 的简写字母组合
- hdu1166 敌兵布阵
- 探索hash_set
- 18.6.5 存储和数据恢复
- min_element()与max_element()
- a+++++b 运算逻辑
- 函数调用栈与活动记录
- HttpClient 教程
- iOS应用内置付费 In-App Purchase 详细介绍(IAP详解)
- HNU 12813 Restore Calculation