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. 51nod 1120 机器人走方格 V3

    N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走. 并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法? 由于方法数量可能很大,只需要输出Mod 1 ...

  2. BestCoder Round #40 解题报告

    这场是第一场没有米的BC... 大概也是想震一震那些一听说没米了就不打BC的人吧 这次的题目质量比以往高了许多 (然而我并没有打这一场BC 但是今天下午到现在做的过程中真的学到了不少知识呢 A题略水. ...

  3. CodeForces - 1015D

    There are nn houses in a row. They are numbered from 11 to nn in order from left to right. Initially ...

  4. 通过cordova将vue项目打包为webapp

    准备工作:需要之前配置好vue-cli脚架构,安装好cordova环境.下面开始对vue.js项目进行打包,打包环境为Android. 可以看下我的github:https://github.com/ ...

  5. VC进度条的使用

    m_progress->GetPos(); //获取进度条的当前位置 m_progress->GetRange(int min,int max); //获取进度条控件的范围的下限和上限 m ...

  6. defer用途

    package main /* defer :程序退出时执行,先进后执行 defer庸碌: 1.关闭文件句柄 2.锁资源释放 3.数据库连接释放 */ import ( "fmt" ...

  7. 【Linux学习】python脚本直接运行与nohup运行结果不同

    之前遇到问题,在云主机上运行python脚本直接运行与nohup运行结果不同,甚至nohup根本运行不出来. 后来参考下别人的博客,终于知道问题了. nohup 使用的python版本问题. 而且no ...

  8. [Leetcode] N-Queens 系列

    N-Queens 系列题解 题目来源: N-Queens N-Queens II N-Queens The n-queens puzzle is the problem of placing n qu ...

  9. SSL handshake failed: SSL error: Key usage violation in certificate has been detected.

    sudo apt-get install libneon27-dev cd /usr/libsudo mv libneon-gnutls.so.27 libneon-gnutls.so.27.olds ...

  10. 使用navicat for sqlserver 把excel中的数据导入到sqlserver数据库

    以前记得使用excel向mysql中导入过数据,今天使用excel向sqlserver2005导入了数据,在此把做法记录一下 第一步:准备excel数据,在这个excel中有3个sheet,每个she ...