codevs1081 线段树练习 2<区间修改>
1081 线段树练习 2
给你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<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<区间修改>的更多相关文章
- HDU1698 线段树入门之区间修改/查询(lazy标记法)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【codevs】1082 线段树练习 3 <区间修改+区间和>
题目连接 http://codevs.cn/problem/1082/ Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. In ...
- 约会安排 HDU - 4553(线段树区间查询,区间修改,区间合并)
题目: 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑, ...
- C++-POJ2777-Count Color[线段树][lazy标记][区间修改]
分析:https://www.bilibili.com/read/cv4777102 #include <cstdio> #include <algorithm> using ...
- HDU 1754 I Hate It(线段树单点替换+区间最值)
I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...
- HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)
Fast Arrangement Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 140120 ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...
随机推荐
- LintCode 391: Count Of Airplanes
LintCode 391: Count Of Airplanes 题目描述 给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机? 样例 对于每架飞机的起 ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings
[题意]带修改的查询区间第k小 [算法]树状数组套可持久化线段树 [题解]对于树状数组上的每个节点,维护可持久化权值线段树(节点为权值),从而达到查询前缀和的目的. 对于每次修改,在待修改线段树基础上 ...
- 【LIbreOJ】#6256. 「CodePlus 2017 12 月赛」可做题1
[题意]定义一个n阶正方形矩阵为“巧妙的”当且仅当:任意选择其中n个不同行列的数字之和相同. 给定n*m的矩阵,T次询问以(x,y)为左上角的k阶矩阵是否巧妙.n,m<=500,T<=10 ...
- JS设计模式——5.单体模式(用了这么久,竟全然不知!)
单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? 1.可以用它来划分命名空间(这个就是就是经常用的了) 2.利用分支技术来封装浏览器之间的差异(这个还真没用过,挺新鲜) 3.借 ...
- phpmywind调用方法大全
头部文件调用 <?php require_once('header.php'); ?> 底部文件调用 <?php require_once('footer.php'); ?> ...
- 动态规划_01背包问题_Java实现
原文地址:http://blog.csdn.net/ljmingcom304/article/details/50328141 本文出自:[梁敬明的博客] 1.动态规划 什么是动态规划?动态规划就是将 ...
- linux的主题与图标
我先在使用arch跟xfce, 速度没得说,偶尔用一下openbox 有一天将xfce的声音给搞没了,完全不知道哪里配置错了,只好将用户文件夹下的所有配置删除,然后重启进入一切又ok啦 说一下主题,小 ...
- java线上应用故障排查之二:高内存占用【转】
前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查. 搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGe ...
- 343.Integer Break---dp
题目链接:https://leetcode.com/problems/integer-break/description/ 题目大意:给定一个自然数,将其分解,对其分解的数作乘积,找出最大的乘积结果. ...
- HDU 1285 确定比赛名次(拓扑排序模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目大意:有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行 ...