codevs 1081 线段树练习 2
2016-03-25 09:17
363 查看
1081 线段树练习 2
时间限制: 1 s空间限制: 128000 KB
题目等级 : 大师 Master
题目描述 Description
给你N个数,有两种操作
1:给区间[a,b]的所有数都增加X
2:询问第i个数是什么?
输入描述 Input Description
第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少。
输出描述 Output Description
对于每个询问输出一行一个答案
样例输入 Sample Input
3
1
2
3
2
1 2 3 2
2 3
样例输出 Sample Output
5
数据范围及提示 Data Size & Hint
数据范围
1<=n<=100000
1<=q<=100000
代码一:
#include<cstdio> #include<iostream> using namespace std; #define INF 100001 int sz[INF]; struct node { int l,r,delta; node *child[2]; int val; }*root=NULL; int n,q,a,b,c,x; void input() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&sz[i]); } void update(node *cur) { cur->val=cur->child[0]->val+cur->child[1]->val; } void bulid(node *&cur,int l,int r) { if(l>r) return ; cur=new node; cur->l=l;cur->r=r; cur->delta=0; if(l==r) { cur->child[0]=cur->child[1]=NULL; cur->val=sz[l]; } else { int mid=(l+r)/2; bulid(cur->child[0],l,mid); bulid(cur->child[1],mid+1,r); // update(cur); } } void down(node * cur) { if(cur->child[0]) { cur->child[0]->delta+=cur->delta; cur->child[0]->val+=cur->delta*(cur->child[0]->r-cur->child[0]->l+1); } if(cur->child[1]) { cur->child[1]->delta+=cur->delta; cur->child[1]->val+=cur->delta*(cur->child[1]->r-cur->child[1]->l+1); } cur->delta=0; } void add(node* cur,int l,int r,int delta) { if(cur->l>=l&&cur->r<=r) { cur->delta+=delta; cur->val+=delta*(cur->l-cur->r+1); return ; } int mid=(cur->l+cur->r)/2; if(cur->delta) down(cur); if(l<=mid) add(cur->child[0],l,r,delta); if(r>mid) add(cur->child[1],l,r,delta); } int query(node* cur,int x) { if(cur->l==cur->r) { return cur->val; } if(cur->delta) down(cur); int mid=(cur->l+cur->r)/2; if(x<=mid) return query(cur->child[0],x); else return query(cur->child[1],x); } int main() { input(); bulid(root,1,n); scanf("%d",&q); while(q--) { scanf("%d",&x); if(x==1){ scanf("%d%d%d",&a,&b,&c); add(root,a,b,c); } else { scanf("%d",&a); printf("%d\n",query(root,a)); } } return 0; }
mine
相关文章推荐
- shell从函数文件里调用函数
- 【转】教你如何迅速秒杀99%的海量数据处理面试题
- 十大javaScript框架
- LearnMVC5-AddView
- PHP5.2中PDO的简单使用方法
- 科大讯飞视频检测并验证
- hdu 1576 A/B 扩展欧几里得算法
- Constructing Roads——F
- 周鸿祎:程序员创业成功率极低 他们的能力只是控制机器
- Checking if a user is a member in a SharePoint group within web InfoPath 2010 forms
- 手游《火影忍者》产品分析:基本框架与资源系统
- grpc-demo
- cxf 测试时问题整理
- 扒开系统调用的三层皮(下)/给MenuOS增加time和time-asm命令
- Linux 学习之路:认识shell和bash
- C语言——标准库
- 最短路POJ 3268
- PAT 乙级 1030.完美数列
- 设置Hadoop用户以便访问任何HDFS文件
- Web Dynpro学习