HDU 1166 敌兵布阵(线段树基础)
2015-02-07 14:10
405 查看
中文体面...考察线段树基本操作单点更新,区间查询...因为手边没有以前用的模板,然后就自己写了一个,估计写的比较挫....
PS:并差集和剩下的最短路四道题好难的样子...然后就来到了线段树...
PS:并差集和剩下的最短路四道题好难的样子...然后就来到了线段树...
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<iostream> #include<queue> #include<stack> using namespace std; struct node { int l,r,x; } data[300000]; void build(int l,int r,int k) { data[k].l=l; data[k].r=r; if(l==r) { int x; scanf("%d",&x); data[k].x=x; return ; } int mid=(l+r)>>1; build(l,mid,k*2); build(mid+1,r,k*2+1); data[k].x=data[k*2].x+data[k*2+1].x; } void add(int c,int k,int x) { if(data[k].l==c&&data[k].l==data[k].r) { data[k].x+=x; return ; } if(c<data[k].l||c>data[k].r) return ; add(c,k*2,x); add(c,k*2+1,x); data[k].x=data[k*2].x+data[k*2+1].x; } int query(int l,int r,int k) { if(data[k].l==l&&data[k].r==r) return data[k].x; if(data[k].l>r||data[k].r<l) return 0; int mid=(data[k].r+data[k].l)>>1; if(r<=mid) return query(l,r,k*2); else if(l>=mid+1) return query(l,r,k*2+1); else return query(l,mid,k*2)+query(mid+1,r,k*2+1); } int main() { int T,n; scanf("%d",&T); for(int cas=1; cas<=T; cas++) { scanf("%d",&n); build(1,n,1); char s[300]; printf("Case %d:\n",cas); while(scanf("%s",s),s[0]!='E') { int x,y; scanf("%d %d",&x,&y); if(s[0]=='A') add(x,1,y); else if(s[0]=='S') add(x,1,-y); else if(s[0]=='Q') printf("%d\n",query(x,y,1)); } } return 0; }
相关文章推荐
- HDU 1166 敌兵布阵(基础线段树~)
- hdu 1166 敌兵布阵 线段树基础经典题
- hdu 1166 敌兵布阵(线段树基础题)
- [HDU]HDOJ1166 敌兵布阵 基础线段树
- HDU 1166 敌兵布阵(线段树基础)
- hdu 1166 敌兵布阵(线段树基础题)
- HDU--1166--敌兵布阵--线段树--基础题咯
- HDU 1166 敌兵布阵 (线段树基础&树状数组基础)
- hdu 1166 敌兵布阵 基础线段树 2种做法
- HDU-1166-敌兵布阵(线段树)
- hdu 敌兵布阵 线段树基础
- 敌兵布阵 1166 HDU 线段树
- HDU 1166 敌兵布阵 [线段树-单点更新]
- HDU 1166 敌兵布阵(线段树)
- hdu 1166 敌兵布阵 线段树求区间和和修改点的值
- HDU 1166 敌兵布阵(第一个线段树)
- hdu 1166 敌兵布阵 (线段树)
- HDU 1166 敌兵布阵 我的第一棵树,线段树,树状数组。
- HDU 1166 敌兵布阵(树状数组,线段树)
- 杭电hdu 1166 敌兵布阵 线段树