HDOJ 1166 -----线段树
来源:互联网 发布:java awt和swing 编辑:程序博客网 时间:2024/05/22 10:36
题目大意:输入T,表示测试用例数,然后输入N,表示有多少个营地,然后跟着输入N行表示,分别表示每个营地有多少人,之后则是一些命令操作(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 表示结束,这条命令在每组数据最后出现;
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
(4)End 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令。最后输出每个Query区间的人数。
算法思想:
本体主要考察线段树的使用,及其一些基本操作。建立线段树,查询线段树,更新线段树。
代码如下:
#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define M 50005#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int sum[M<<2];//线段树的空间是数组长度的4倍inline void PushPlus(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];//左右子树相加}/*递归建立线段树*/void Build(int l,int r,int rt){ if(l==r){//只有一个节点 scanf("%d",&sum[rt]); return ; } int m=(l+r)>>1; Build(lson);//左子树 Build(rson);//右子树 PushPlus(rt);}/*更新线段树操作*/void Update(int p,int add,int l,int r,int rt){ if(l==r){//只有一个节点 sum[rt]+=add; return ; } int m=(l+r)>>1; if(p<=m)//更新节点在左区间 Update(p,add,lson); else//更新节点在右区间 Update(p,add,rson); PushPlus(rt);}/*查询线段树操作*/int Query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R)//查询区间包括了整棵线段树 { return sum[rt]; } int m=(l+r)>>1; int ans=0; /*查询区间分两半,左一半,右一半*/ if(L<=m)//查询左半区间 ans+=Query(L,R,lson); if(R>m) //查询右半区间 ans+=Query(L,R,rson); return ans;}int main(){ int T,n,a,b; scanf("%d",&T); for(int i=1;i<=T;i++){ printf("Case %d:\n",i); scanf("%d",&n); Build(1,n,1);//建立一个以1为根长度为n的线段树 char op[10];//存储命令字符串 while(scanf("%s",op)&&op[0]!='E'){//到End是结束循环 scanf("%d %d",&a,&b); if(op[0]=='Q') printf("%d\n",Query(a,b,1,n,1)); else if(op[0]=='S') Update(a,-b,1,n,1); else Update(a,b,1,n,1); } } return 0;}
0 0
- HDOJ 1166(线段树)
- hdoj 1166 线段树
- HDOJ 1166 -----线段树
- HDU/HDOJ 1166 线段树
- HDOJ 1166 敌兵布阵 (线段树)
- hdoj 1166 敌兵布阵 【线段树】
- 【HDOJ】1166 敌兵布阵 (线段树)
- HDOJ 1166 敌兵布阵(线段树,裸)
- hdoj 1166 敌兵布阵(线段树)
- hdoj 1166 敌兵布阵 【单点线段树】
- hdoj--1166--敌兵布阵(线段树)
- HDOJ 1166(数组保存线段树)
- HDOJ 1166 敌兵布阵(线段树)
- HDOJ 1754 (线段树)
- HDOJ 1698 (线段树)
- hdoj 1698 线段树
- hdoj 1754 【线段树】
- hdoj 4267 - 线段树
- 使用Python脚本编写网络爬出程序,来获取Web数据的方法实现(1)——流程图
- 用Springmvc传文件
- 利用chrome自带工具分析http包
- MVC中实现加载更多
- UVA 12186 Another Crisis(树形DP)
- HDOJ 1166 -----线段树
- jquery学习笔记
- 拿来主义:分享给大家,关于SQL中数据库设置,约束、外键、主键等
- 输入框的有用的特效
- c++中带空格路劲的处理
- 1090 A+B for Input-Output Practice (II)
- 11.lua学习笔记:元表与元方法
- Linux下/proc目录简介
- hdu 5120 圆相交面积+组合数学