HDU 1166 敌兵布阵
来源:互联网 发布:淘宝雪纺衫花色衬衣 编辑:程序博客网 时间:2024/06/16 07:58
裸线段树题目,关于线段树的知识可以先看基本的教材,几乎任一本数据结构里都有的。
先贴一下,动态申请内存的线段树,不过这种方法容易MLE
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;const int maxn=50005;int sum,num[maxn]={0};typedef struct node{ int l,r,data; node *chl,*chr; node(){ l=r=data=0; }}Tree;Tree *build(int s,int t){ Tree *rt; rt=new(Tree); rt->l=s; rt->r=t; if(s==t){ rt->data=num[s]; rt->chl=rt->chr=NULL; } else{ int mid=(s+t)>>1; rt->chl=build(s,mid); rt->chr=build(mid+1,t); rt->data=rt->chl->data+rt->chr->data; } return rt;}void updata(Tree *rt,int d,int v){ if(rt->l==d&&rt->r==d){ rt->data+=v; return ; } int mid=(rt->l+rt->r)>>1; if(d<=mid)updata(rt->chl,d,v); else updata(rt->chr,d,v); rt->data+=v;}void query(Tree *rt,int s,int t){ if(rt->l==s&&rt->r==t){ sum+=rt->data; return ; } int mid=(rt->l+rt->r)>>1; if(t<=mid)query(rt->chl,s,t); else if(s>mid)query(rt->chr,s,t); else { query(rt->chl,s,mid); query(rt->chr,mid+1,t); }}int main(){ int t,n; scanf("%d",&t); for(int i=1;i<=t;i++){ scanf("%d",&n); for(int j=1;j<=n;++j) scanf("%d",num+j); printf("Case %d:\n",i); Tree *T; T=build(1,n); char com[10]; while(scanf("%s",com)){ if(com[0]=='E'){ break; } int d,v; scanf("%d%d",&d,&v); if(com[0]=='Q'){ sum=0; query(T,d,v); printf("%d\n",sum); } else if(com[0]=='A') updata(T,d,v); else updata(T,d,-v); } } return 0;}
再来一下以数组建立的线段树,因为是平衡二叉树,所以建立比较容易。(Notonlysucess风格,参见其线段树完全版)
#include <cstdio>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn=60005;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 cas=1;cas<=T;cas++){ scanf("%d",&n); build(1,n,1); printf("Case %d:\n",cas); char op[10]; 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;}
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 敌兵布阵
- hdu 2122 Ice_cream’s world III(最小生成树)
- hadoop分布式平台优化
- AppSettings和ConnectionStrings的区别
- 单例模式
- sql server 数据类型
- HDU 1166 敌兵布阵
- sdut 面向对象程序设计上机练习十一(运算符重载)
- 黑马程序员-----面霸题目
- 用jsp写注册页面
- A + B Problem
- \\w+\\|\\d+ 这个在java里啥意思啊?
- Android之简单Socket编程
- GridControl详解(一)原汁原味的表格展示
- C语言知识查漏补缺与心得体会(1)