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 ; }

codevs1081 线段树练习 2<区间修改>的更多相关文章

  1. HDU1698 线段树入门之区间修改/查询(lazy标记法)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. 【codevs】1082 线段树练习 3 <区间修改+区间和>

    题目连接   http://codevs.cn/problem/1082/ Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. In ...

  3. 约会安排 HDU - 4553(线段树区间查询,区间修改,区间合并)

    题目: 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑, ...

  4. C++-POJ2777-Count Color[线段树][lazy标记][区间修改]

     分析:https://www.bilibili.com/read/cv4777102 #include <cstdio> #include <algorithm> using ...

  5. HDU 1754 I Hate It(线段树单点替换+区间最值)

    I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...

  6. HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)

    Fast Arrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  7. POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 140120 ...

  8. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  9. 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询

    题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...

随机推荐

  1. HashSet的特性介绍

    HashSet除了在元素的存储上是无序的以外,还是不能够存储重复的元素. HashSet如何判断元素是否重复呢?是根据元素继承的两个方法来判断,hashCode和equals,当存储元素时,首先判断要 ...

  2. 【CodeForces】827 D. Best Edge Weight 最小生成树+倍增LCA+并查集

    [题目]D. Best Edge Weight [题意]给定n个点m条边的带边权无向连通图,对每条边求最大边权,满足其他边权不变的前提下图的任意最小生成树都经过它.n,m<=2*10^5,1&l ...

  3. Java并发编程学习路线

    一年前由于工作需要从微软技术栈入坑Java,并陆陆续续做了一个Java后台项目,目前在搞Scala+Java混合的后台开发,一直觉得并发编程是所有后台工程师的基本功,所以也学习了小一年Java的并发工 ...

  4. cmd 使用gii的命令行用法

    1.生成模型 php yii gii/model --ns=common\models --tableName=contract_supplemental --modelClass=ContractS ...

  5. 用jquery实现小火箭到页面顶部的效果

    恩,不知道之前在哪看过一个页面效果就是如果页面被滑动了就出现一个小火箭,点击这个小火箭就可以慢慢回到页面顶部,闲的没事,自己搞了一下 需要引入jquery 代码和布局都很简单 <!DOCTYPE ...

  6. Linux下文本浏览器lynx

    一般登录到Linux上的时候都是使用Shell登录上去的,但是如果这个时候我们有浏览网页的需求怎么办,比如我刚刚部署上去一个网站,但是我并不知道我有没有部署成功,而且只能在这一台Linux上能够访问到 ...

  7. NASA: SpaceX的猎鹰9号火箭将龙飞船发射到国际空间站

    At 5:42 a.m. EDT Friday, June 29, 2018, SpaceX’s Dragon spacecraft lifts off on a Falcon 9 rocket fr ...

  8. 面试中关于Redis的问题看这篇就够了

    昨天写了一篇自己搭建redis集群并在自己项目中使用的文章,今天早上看别人写的面经发现redis在面试中还是比较常问的(笔主主Java方向).所以查阅官方文档以及他人造好的轮子,总结了一些redis面 ...

  9. flask插件系列之flask_celery异步任务神器

    现在继续学习在集成的框架中如何使用celery. 在Flask中使用celery 在Flask中集成celery需要做到两点: 创建celery的实例对象的名字必须是flask应用程序app的名字,否 ...

  10. Python学习笔记——数据结构和算法(二)

    1.字典中一个键映射多个值 可以使用collections中的defaultdict来实现,defalultdict接受list或者set为参数 from collections import def ...