HDU 1166 敌兵布阵
来源:互联网 发布:sql游标的用法 编辑:程序博客网 时间:2024/06/05 03:59
线段树
单点更新
NotOnlySuccess版(耗用内存较小)
#include<bits/stdc++.h>#define lson l,m,rt<<1 //左儿子#define rson m+1,r,rt<<1|1 //右儿子const int maxn=50020;int sum[maxn<<2];void PushUP(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);PushUP(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);PushUP(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 ret=0;if(L<=m) ret+=query(L,R,lson);if(R>m) ret+=query(L,R,rson);return ret;}int main() {int T,n;scanf("%d",&T);for(int kase=1;kase<=T;kase++){printf("Case %d:\n",kase);scanf("%d",&n);build(1,n,1);char op[20];while(scanf("%s",op)){if(op[0]=='E') break;int a,b;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;}
自己写的
#include<bits/stdc++.h>using namespace std;int a[50020<<2];struct node{ int l,r,mid,sum;}s[50020<<2];void build(int id,int l,int r){ s[id].l=l,s[id].r=r; s[id].mid=(l+r)>>1; if(l==r) s[id].sum=a[l]; else { build(id<<1,l,s[id].mid); build(id<<1|1,s[id].mid+1,r); s[id].sum=s[id<<1|1].sum+s[id<<1].sum; }}void update(int id,int p,int add){ s[id].sum+=add; if(s[id].l==s[id].r) return; if(p<=s[id].mid) update(id<<1,p,add); else if(p>s[id].mid) update(id<<1|1,p,add);}int query(int id,int l,int r){ if(l<=s[id].l&&r>=s[id].r) return s[id].sum; else if(l>s[id].mid) return query(id<<1|1,l,r); else if(r<=s[id].mid) return query(id<<1,l,r); else return query(id<<1|1,l,r)+query(id<<1,l,r);}int main(){ int T,N,I,J; char str[20]; scanf("%d",&T); for(int kase=1;kase<=T;kase++) { printf("Case %d:\n",kase); scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d",&a[i]); build(1,1,N); while(scanf("%s",str)) { if(str[0]=='Q') { scanf("%d%d",&I,&J); printf("%d\n",query(1,I,J)); } else if(str[0]=='A') { scanf("%d%d",&I,&J); update(1,I,J); } else if(str[0]=='S') { scanf("%d%d",&I,&J); update(1,I,-J); } 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 3083 Children of the Candy Corn
- Socket.IO进阶
- css 背景图片自适应元素大小
- Solr In Action 中文版 第一章(三)
- HDU 1166 敌兵布阵
- hadoop实例
- 腾讯互娱旗下工作室一览
- 位运算
- linux-android移植开发
- maven 与jdk相关的报错 1.3……
- POJ-2192-Polygon
- requestWindowFeature使用详解
- ubuntu升级firefox