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. (知识扩展)R运用领域一览表

    • Applications and Case Studies - Lessons and Experiences • Big Data Analytics • Biomedical and Heal ...

  2. hihocoder1415 后缀数组三·重复旋律3

    传送门:http://hihocoder.com/problemset/problem/1415 [题解] 考虑求出两串合在一起(中间加分隔符)后缀数组,就是要求任意在两个串中的$i, j$,$\mi ...

  3. Gmail登录(2017.10)

    本文地址:http://www.cnblogs.com/veinyin/p/7646382.html  由于众所周知的原因,我们使用 Gmail 查看邮件时会有些麻烦,有时梯子不够用甚至不能查看. 比 ...

  4. jQuery.pin.js笔记

    jQuery.pin.js是一个把元素钉在页面上某个位置的插件,它能够将某个元素一直挂在一个固定的位置而不论滚动条是否滚动. 特点: 1. 可以钉住一个元素,主要作用就是滚动超出的时候不会隐藏而是一直 ...

  5. c语言学习笔记.数组.

    数组: 可以存储一个固定大小的相同类型元素的顺序集合,比如int类型的数组.float类型的数组,里面存放的数据称为“元素”. 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址 ...

  6. 统计oracle表中字段的个数

    select count(column_name) from user_tab_columns where table_name='emp' dba权限对应的视图是dba_tab_columns 和a ...

  7. java反序列化漏洞

    http://www.freebuf.com/vuls/86566.html 有时间了  仔细阅读

  8. makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析【转】

    转自:http://www.cnblogs.com/lifexy/p/7089873.html 先来分析一个简单的.lds链接脚本 例1,假如现在有head.c init.c nand.c main. ...

  9. ubuntu新机安装工具

    ubuntu新机安装工具:1,sudo apt-get install ssh vim2, 设置root密码,以备不时之需: 执行:sudo passwd root 然后输入当前三次密码,第一次是当前 ...

  10. 在C#中用MediaInfo获取视频或音频的属性

    MediaInfo是一个开源的获取视频或音频的信息的非常便利的工具,它本身就带有一个GUI界面,可以非常方便我们查看视频信息.但是,当我们写一些转码程序时,往往需要在程序中获取视频信息的时候. 以前我 ...