nyoj1115-士兵杀敌(二)(线段树单点更新,区间求和)
来源:互联网 发布:网络平台服务协议 编辑:程序博客网 时间:2024/06/04 20:03
题目来源:http://acm.nyist.me/OJ/pid=1115
题意
中文题意,。
思路
学完了数据结构的树这一节,对区间这种问题有了一定的了解,自己手打。。。这应该算是模板。。。
代码
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=1000000;int tree[maxn<<2];int n,q,rt;void build(int l,int r,int rt){ if(l==r) { scanf("%d",&tree[rt]); } else { int m=(l+r)/2; build(l,m,rt<<1); build(m+1,r,(rt<<1)+1); tree[rt]+=tree[rt<<1]+tree[(rt<<1)+1]; }}void update(int l,int r,int x,int y,int rt){ if(l==r&&r==x) { tree[rt]+=y; return ; } int m=(l+r)/2; if(m>=x) { update(l,m,x,y,rt<<1); } else { update(m+1,r,x,y,(rt<<1)+1); } tree[rt]=tree[rt<<1]+tree[(rt<<1)+1];}int query(int l,int r,int L,int R,int rt){ if(l<=L&&R<=r) return tree[rt]; int m=(L+R)/2; int ret=0; if(m>=l) ret+=query(l,r,L,m,rt<<1); if(m+1<=r) ret+=query(l,r,m+1,R,(rt<<1)+1); return ret;}int main(){ int n,q; scanf("%d%d",&n,&q); build(1,n,1);// for(int i=1;i<=9;i++)// printf("tree[%d]=%d ",i,tree[i]);// printf("\n"); while(q--) { char s[10]; int x,y; scanf("%s",s); scanf("%d%d",&x,&y); if(s[0]=='Q') { printf("%d\n",query(x,y,1,n,1)); } else { update(1,n,x,y,1); } }}
阅读全文
0 0
- nyoj1115-士兵杀敌(二)(线段树单点更新,区间求和)
- NYOJ116 士兵杀敌(二)(线段树区单点更新,区间求和,zkw线段树)
- ny 116 士兵杀敌(二) -- 线段树(单点更新,区间求和)
- NYOJ 116 士兵杀敌(二)(线段树区间求和+单点更新)
- NYOJ 116 士兵杀敌(二)(线段树—区间求和,单点加值更新)
- NYOJ116 士兵杀敌(二) 单点更新+区间求和
- nyoj 116 士兵杀敌(二)【线段树】区间求和
- nyoj 116 士兵杀敌(二) 【线段树】区间求和&&节点更新
- nyoj116 士兵杀敌(二)(线段树的区间查询和单点更新)
- 【解题报告】 NYOJ 116 士兵杀敌(二) 线段树 单点更新求区间和
- NYOJ 116 士兵杀敌(二)【线段树 单点更新】
- nyoj116士兵杀敌(二)线段树单点更新
- NYIST 116 士兵杀敌(二) --- 线段树区间更新
- ny 228 士兵杀敌(五)-- 神题,慢慢理解(线段树 区间更新,区间求和)
- NYOJ-士兵杀敌(五) 线段树区间更新、线段求和
- NYOJ116 士兵杀敌(二) 线段数、单点更新
- 线段树之区间求和(士兵杀敌(一))
- NYOJ士兵杀敌(一) 线段树区间求和
- EhCache注解使用
- 用Windows自带工具给U盘4k对齐
- 求数组中第K个最大的值
- 条款18:让接口容易被正确使用,不易被误用
- JavaScript标识符命名规则
- nyoj1115-士兵杀敌(二)(线段树单点更新,区间求和)
- CSS
- 第7周项目5 排队看病模拟
- 用两个栈来实现一个队列
- linux之在当前目录下删除不包含aa的文件
- Spring MVC的web.xml配置加解析
- struts2框架配置
- Thread类源码分析
- [agc009d]Uninity