博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1166 敌兵布阵
阅读量:7054 次
发布时间:2019-06-28

本文共 1693 字,大约阅读时间需要 5 分钟。

线段树最简单的题目:区间求和,修改单点数值,中文题目就不说题意了

今天看了神牛的代码感慨良多,写代码像写诗一样

感觉自己的代码就是写得太累赘

下次线段树要加大难度了

#include 
#include
#define N 50010struct node{ int a,b; int sum;}tree[4*N];int n;void updata(int p ,int e , int root){ tree[root].sum+=e; if(tree[root].a==tree[root].b) return ; int mid=(tree[root].a+tree[root].b)/2; if(p<=mid) updata(p,e,2*root); else updata(p,e,2*root+1); return ;}int query(int a ,int b ,int root){ int mid=(tree[root].a+tree[root].b)/2; if(tree[root].a==a && tree[root].b==b) return tree[root].sum; else if(a>mid) return query(a,b,2*root+1); else if(b<=mid) return query(a,b,2*root); else return query(a,mid,2*root)+query(mid+1,b,2*root+1);}void build(int a ,int b,int root){ tree[root].a=a; tree[root].b=b; if(a==b) { scanf("%d",&tree[root].sum); return ; } int mid=(a+b)/2; build(a,mid,2*root); build(mid+1,b,2*root+1); tree[root].sum=tree[2*root].sum+tree[2*root+1].sum; return ;}int main(){ int T,Case; scanf("%d",&T); for(Case=1; Case<=T; Case++) { scanf("%d",&n); build(1,n,1); printf("Case %d:\n",Case); char s[10]; while(1) { int a,b,ans; scanf("%s",s); if(s[0]=='E') break; scanf("%d%d",&a,&b); if(s[0]=='Q') { ans=query(a,b,1); //询问区间[a,b]内的和 printf("%d\n",ans); } else if(s[0]=='A') updata(a,b,1); //元结点a的值增加b else updata(a,-b,1); //元结点a的值减少b } } return 0;}

 

 

 

转载于:https://www.cnblogs.com/scau20110726/archive/2013/01/30/2883817.html

你可能感兴趣的文章
vim
查看>>
在Linux下用LVS和Ipvsadm做Web负载均衡
查看>>
【原创】回到头部 jquery+css3
查看>>
我有一个好点子,我正好也是一个码农
查看>>
联表取数据
查看>>
web.xml详解
查看>>
刘硕琛_下一代企业安全管理
查看>>
备战网络工程师认证考试:历年真题合集
查看>>
Swift基础教程
查看>>
Stepped Slider
查看>>
Unity客户端框架
查看>>
xargs
查看>>
RelativeLayout相对布局
查看>>
一个基于Python 装饰器的缓存库——wrapcache
查看>>
linux eclipse 离线安装svn插件subclipse
查看>>
第二篇,整体架构dbutils dao篇
查看>>
把IP转成整数
查看>>
Android程序员眼中世界上最遥远的距离
查看>>
vim
查看>>
MacOs 开发环境设置
查看>>