HDU:1166 敌兵布阵
来源:互联网 发布:qt creator linux 编辑:程序博客网 时间:2024/05/16 13:54
之前用树状数组过掉了,这次用线段树重写了一遍,和求区间最值的那代码基本一样。。
#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <cmath>#include <queue>#include <vector>#include <map>#include <stack>#include <algorithm>#define MAXN 200005#define MOD 1000000007#define INF -2139062144#define ll long long//ios::sync_with_stdio(false)using namespace std;const int MAXN_N = 1<< 19;int sum[2*MAXN_N],mxn,N;void Init(){ mxn=1; while(mxn<N) mxn*=2; memset(sum,0,sizeof(sum));}void update(int k,int val){ k+=mxn-1; sum[k]+=val; while(k/2>0) { k=k/2; sum[k]+=val; }}int Query(int a,int b,int k,int l,int r){ if(r<a||b<l) return 0; if(a<=l&&r<=b) return sum[k]; else { int v1=Query(a,b,2*k,l,(l+r)/2); int v2=Query(a,b,2*k+1,(l+r)/2+1,r); return v1+v2; }}int main(){ int T,kase=0; scanf("%d",&T); while(T--) { scanf("%d",&N); Init(); for(int i=1; i<=N; ++i) { int t; scanf("%d",&t); update(i,t); } char str[10]; printf("Case %d:\n",++kase); while(scanf("%s",str)) { if(str[0]=='E') break; int a,b; scanf("%d%d",&a,&b); if(str[0]=='Q') printf("%d\n",Query(a,b,1,1,mxn)); else if(str[0]=='A') update(a,b); else update(a,-b); } } 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 敌兵布阵
- 很好的ios学习网站
- JAVA基础1
- div overflow属性
- 导入Android4.2源码里的Gallery2和Camera模块至Eclipse全过程
- mysql_server下载安装
- HDU:1166 敌兵布阵
- RPC: 工作原理
- 年会小记
- Dephi泛型generic的应用
- 为什么全球最好的大学大半在美国?看看美国的孩子是怎么念书的
- oracle 字符串分割转化为多条记录
- 写作年表
- 很酷的C语言技巧
- 浅谈JAVA同步(一)