[线段树 点更新 段查询]A
来源:互联网 发布:2017 a号黑豹数据 编辑:程序博客网 时间:2024/05/14 14:34
**[线段树 点更新 段查询]A - 敌兵布阵 HDU - 1166 **
题目大意:有1-n个敌营,每个敌营有一定数目的敌人。三种操作:1,i敌营人数增加j;2,i敌营人数减少j;3,查询区间i,j敌营人数的总和。
分析:很显然更新要到点,查询则是区间,所以结点只需要保存区间人数总和即可。
对于减操作,只需增加-j即可。
#include<stdio.h>#include<algorithm>using namespace std;struct node{ int l,r; int sum;};node tree[200005];int mid(int root){ return (tree[root].l+tree[root].r)/2;}void BuildTree(int root,int l,int r){ tree[root].l=l; tree[root].r=r; tree[root].sum=0; if(l!=r) { BuildTree(2*root+1,tree[root].l,mid(root)); BuildTree(2*root+2,mid(root)+1,tree[root].r); }}void Insert(int root,int i,int v){ if(tree[root].l==tree[root].r) { tree[root].sum=v; return; } tree[root].sum+=v; if(i<=mid(root)) { Insert(2*root+1,i,v); } else { Insert(2*root+2,i,v); }}int Query(int root,int a,int b){ if(tree[root].l==a&&tree[root].r==b) { return tree[root].sum; } if(b<=mid(root)) { return Query(2*root+1,a,b); } else if(a>mid(root)) { return Query(2*root+2,a,b); } else { return Query(2*root+1,a,mid(root))+Query(2*root+2,mid(root)+1,b); }}void Add(int root,int i,int v){ if(tree[root].l==tree[root].r) { tree[root].sum+=v; return; } tree[root].sum+=v; if(i<=mid(root)) { Add(2*root+1,i,v); } else { Add(2*root+2,i,v); }}int main(){ int t; scanf("%d",&t); int ans=1; while(t--) { int n; scanf("%d",&n); BuildTree(0,1,n); int t; for(int i=1;i<=n;i++) { scanf("%d",&t); Insert(0,i,t); } char s[10]; printf("Case %d:\n",ans++); while(scanf("%s",s)) { if(s[0]=='E') { break; } else if(s[0]=='Q') { int i,j; scanf("%d %d",&i,&j); int re=Query(0,i,j); printf("%d\n",re); } else if(s[0]=='A') { int i,j; scanf("%d %d",&i,&j); Add(0,i,j); } else if(s[0]=='S') { int i,j; scanf("%d %d",&i,&j); Add(0,i,-j); } } } return 0;}
阅读全文
0 0
- [线段树 点更新 段查询]A
- HDOJ 1166 点更新段查询求和 初级线段树
- HDU 1166 点更新段查询线段树
- HDU 1754 点更新段查询最大值线段树
- 线段树 点更新和段更新
- A Simple Problem with Integers(线段树之区间点的成段更新)
- Just a Hook(线段树之点的成段更新)
- HDOJ 1698 段更新段查询 初级线段树
- HDOJ 1698 段更新段查询 初级线段树
- poj 3468 A Simple Problem with Integers(线段树|成段更新,区间查询)
- 线段树--点更新--点查询--最值差查询--poj3264
- hdu3074Multiply game(线段树 点更新,求段的积)
- HDU4046Panda (线段树 点更新,段查寻)
- HDOJ 1754 单点更新段查询最大值 初级线段树
- HDOJ 3874 Necklace 线段树 单点更新 成段查询
- HDU 1698 Just a Hook [线段树-成段更新]
- hdu 1698 Just a Hook(线段树 成段更新)
- 线段树 [成段更新] HDU 1698 Just a Hook
- 面试热题——进制转换(n进制转换成2进制)
- 故障案例--mongo 3.0鉴权导致cpu居高不下
- nyoj 487点数(向量积判断三角形内部的整点)
- 如何查看codeblock的头文件
- HTML基础[思维导图]
- [线段树 点更新 段查询]A
- hdoj1074 Doing Homework (状态压缩 DP)
- 互信息(Mutual Information)和χ 2特征选择方法去噪处理
- laravel学习
- 权限修饰符、状态修饰符、抽象修饰符使用规则
- 常用ADB命令使用和adb logcat 命令行用法 monkey压力测试
- Android 自定义弹窗
- 教你彻底解决Eclipse自动补全变量
- bzoj1417: Pku3156 Interconnect