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

NotOnlySuccess

有兴趣的可以去这个博客看一下线段树,讲的真是很好。

先看一个暴力吧并没有什么用, 我只是比较惊讶于暴力的神奇 ;正解在下边。.

 #include<iostream>
using namespace std;
#include<cstdio>
int n,m,a[],l,r,f;
int main() {
cin>>n;
for(int i=; i<=n; i++)
cin>>a[i];
cin>>m;
for(int i=; i<=m; i++) {
int x;
cin>>x;
if(x==) {
cin>>l>>r>>f;
for(int i=l; i<=r; i++)
a[i]+=f;
}
if(x==) {
cin>>f;
cout<<a[f]<<endl;
}
}
return ;
}

这里才是正解:

 //s d s
#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;
const int N=;
int a[N],sum[N];int miku[N];
int b,c,d,e; void update(int rt)
{
sum[rt]=sum[rt*]+sum[rt*+];
} void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=a[l];
return ;
}
int m=(l+r)/;
build(l,m,rt*);
build(m+,r,rt*+);
update(rt);
} void midify_interval(int l,int r,int rt,int nowl,int nowr,int neww)
{
if(nowl==l&&nowr==r)
{
miku[rt]+=neww;
sum[rt]+=neww*(r-l+);
return ;
}
int m=(l+r)>>;
if(nowr<=m) midify_interval(l,m,rt*,nowl,nowr,neww);
else if(nowl>m) midify_interval(m+,r,rt*+,nowl,nowr,neww);
else
{
midify_interval(l,m,rt*,nowl,m,neww);
midify_interval(m+,r,rt*+,m+,nowr,neww);
}
update(rt);
} int query(int l,int r,int rt,int nowrt)
{
if(l==r)
{
return sum[rt];
}
int m=(r+l)/;
sum[rt+rt]+=miku[rt]*(m-l+);
sum[rt+rt+]+=miku[rt]*(r-m);
miku[rt+rt]+=miku[rt];
miku[rt+rt+]+=miku[rt];
miku[rt]=;
int ans=;
if(nowrt<=m) ans=query(l,m,rt<<,nowrt);
else if(nowrt>m) ans=query(m+,r,rt*+,nowrt);
return ans;
} int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",a+i);
build(,n,);
int m;
scanf("%d",&m); for(int i=;i<=m;i++)
{
scanf("%d",&b);
if(b==)
{
scanf("%d%d%d",&c,&d,&e);
midify_interval(,n,,c,d,e);
}
if(b==)
{
scanf("%d",&c);
printf("%d\n",query(,n,,c));
}
}
return ; }

最新文章

  1. XAF学习笔记1
  2. Wait Type:IO_COMPLETION
  3. Atitit.atiRI &#160;与 远程调用的理论and 设计
  4. .htaccess的301重定向代码
  5. Durid(一): 原理架构
  6. JavaScript数据结构,队列和栈
  7. 在Oracle中更新数据时,抛出:ORA-01008: not all variables bound
  8. LoadLibraryEx及发回hmodule的一些细节
  9. android adb 常用指令
  10. PAT1005
  11. Judge Route Circle
  12. Spring框架学习01——使用IDEA开发Spring程序
  13. android call and audio
  14. 数据库操作——SQL
  15. Facebook回应追踪无账号用户:源于网站插件漏洞
  16. DART: a fast and accurate RNA-seq mapper with a partitioning strategy DART:使用分区策略的快速准确的RNA-seq映射器
  17. 超棒的在线Bootstrap主题编辑工具 - lollytin
  18. 委托---.net4.0提供两个比较重要的委托
  19. 怎样从Mysql官网下载mysql.tar.gz版本的安装包
  20. bootstrap-daterangepicker插件运用

热门文章

  1. 利用PhantomJS生成网站截图
  2. Spring boot中使用log4j记录日志
  3. SDUT 3923
  4. 【洛谷 P3227】 [HNOI2013]切糕(最小割)
  5. 39、请用代码简答实现stack
  6. MM(Majorize-Minimization, Minorize-Maximization)优化方法
  7. redis基础之redis-cluster(集群)(七)
  8. Python异常捕捉try except else finally有return时执行顺序探究
  9. Python3中对Dict的内存优化
  10. virsh 命令最新整理。 每个“;”之后是正解