hdu(1166)——敌兵布阵(更新节点,区间求和)
来源:互联网 发布:广联达电力预算软件 编辑:程序博客网 时间:2024/06/04 01:23
这是一道最简单的线段树的更新节点与区间查询。
当然practic makes perfect~ 现在我已经能够比较熟练地打出来了。
但是还有一些细节要注意就是对于父节点的更新。
#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespace std;#define maxn 55555char a[55];struct node{ int l,r,sum; int add;}tree[maxn*4];int ans=0;void pushup(int v){ int temp=v*2; tree[v].sum=tree[temp].sum+tree[temp+1].sum;}void pushdown(int v){ int temp=v*2; tree[temp].add+=tree[v].add; tree[temp+1].add+=tree[v].add; tree[temp].sum+=tree[v].add*(tree[temp].r-tree[temp].l+1); tree[temp+1].sum+=tree[v].add*(tree[temp+1].r-tree[temp+1].l+1); tree[v].add=0;}void build(int l,int r,int v){ tree[v].l=l; tree[v].r=r; tree[v].add=0; if(l==r){ scanf("%d",&tree[v].sum); return; } int temp=v*2; int mid=(tree[v].l+tree[v].r)/2; build(l,mid,temp); build(mid+1,r,temp+1); pushup(v);}void update(int pos,int v,int x){ if(pos==tree[v].l&&tree[v].r==pos){ tree[v].add+=x; tree[v].sum+=x*(tree[v].r-tree[v].l+1); return ; } if(tree[v].add) pushdown(v); int mid=(tree[v].l+tree[v].r)/2; int temp=v*2; if(pos<=mid) update(pos,temp,x); else update(pos,temp+1,x); pushup(v); //!!!}void query(int l,int r,int v){ if(r<tree[v].l||tree[v].r<l) return; if(l<=tree[v].l&&tree[v].r<=r){ ans+=tree[v].sum; return; } if(tree[v].add) pushdown(v); int mid=(tree[v].l+tree[v].r)/2; int temp=v*2; if(r<=mid) query(l,r,temp); else if(mid<l) query(l,r,temp+1); else{ query(l,mid,temp); query(mid+1,r,temp+1); }}int main(){ int T,n; int j=1; scanf("%d",&T); while(T--){ scanf("%d",&n); ans=0; bool ff=false; build(1,n,1); #if 1 while(1){ scanf("%s",a); if(strcmp(a,"End")==0) break; if(strcmp(a,"Add")==0){ int r,s; scanf("%d%d",&r,&s); update(r,1,s); } if(strcmp(a,"Sub")==0){ int r,s; scanf("%d%d",&r,&s); update(r,1,-s); } if(strcmp(a,"Query")==0){ ans=0; int r,s; scanf("%d%d",&r,&s); query(r,s,1); if(!ff) printf("Case %d:\n",j++),ff=true; printf("%d\n",ans); } } #endif }}
0 0
- hdu(1166)——敌兵布阵(更新节点,区间求和)
- hdu 1166 敌兵布阵(单点更新及区间求和)
- hdu 1166 敌兵布阵 (单点更新,区间求和)
- 线段树 hdu 1166 敌兵布阵 单点更新区间求和
- HDU 1166 敌兵布阵(线段树:点更新,区间求和)
- HDU 1166 敌兵布阵(区间求和+单点更新)
- hdu 1166 敌兵布阵【线段树】单点更新,区间求和
- HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)
- hdoj 1166 敌兵布阵 【线段树(区间求和&&更新节点)】
- HDOJ 1166 敌兵布阵(单点更新+区间求和)
- hdu 1166 敌兵布阵 (线段树 单点更新 区间求和)
- hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)
- hdu 1166 敌兵布阵(线段树-单点更新,区间求和)
- HDU 1166-敌兵布阵(线段树:单点更新,区间求和)
- HDU 1166 敌兵布阵(线段树:点更新,区间求和)
- HDU 1166 敌兵布阵 数据结构+树状数组+(单点更新区间求和)
- [HDU]1166 敌兵布阵 (线段树--单点更新,区间求和)
- HDU 1166 敌兵布阵(线段树单点更新+区间求和)
- ObjectOutStream的reset方法
- 王师傅卖鞋子 UML 顺序图解析
- 矩形内点的确定
- ASM Instance 加载oracleasm lib创建disk时出现OS Hang现象
- Google Protocol Buffers浅析(一)
- hdu(1166)——敌兵布阵(更新节点,区间求和)
- 我要的生活
- DB2副本DB2COPY1DB2COPY2
- HDU2883kebab(最大流ISAP)离散化思想建图
- 【Java】定时器、线程与匿名内部类
- 使用JDBC连接MySQL数据库--典型案例分析(一)---员工数据读取与操作
- MyBatis数据持久化(一)准备工作
- bash array
- UV镜还是保护镜?差异很大啊!(附14款镜片测试结果)