洛谷P3372 【模板】线段树 1
P3372 【模板】线段树 1
- 153通过
- 525提交
- 题目提供者HansBug
- 标签
- 难度普及+/提高
提交 讨论 题解
最新讨论
- 【模板】线段树1(AAAAAAAAA…
- 【模板】线段树1
- 洛谷评测机出问题了吗?
题目描述
如题,已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数加上x
2.求出某区间每一个数的和
输入输出格式
输入格式:
第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。
第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。
接下来M行每行包含3或4个整数,表示一个操作,具体如下:
操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k
操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和
输出格式:
输出包含若干行整数,即为所有操作2的结果。
输入输出样例
输入样例#1:
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
输出样例#1:
11
8
20
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=1000,M<=10000
对于100%的数据:N<=100000,M<=100000
(数据已经过加强^_^,保证在int64/long long数据范围内)
分析:涉及到区间操作,那么利用lazy-tag思想,当需要处理到本区间时,不必往下处理,打上标记,当需要用的时候下传标记即可.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; long long n, m,sum[],tag[]; void pushdown(int l, int r, int o)
{
if (tag[o])
{
int mid = (l + r) >> ;
tag[o * ] += tag[o];
tag[o * + ] += tag[o];
sum[o * ] += tag[o] * (mid - l + );
sum[o * + ] += tag[o] * (r - mid);
tag[o] = ;
}
} void build(int l, int r, int o)
{
if (l == r)
{
scanf("%lld", &sum[o]);
return;
}
int mid = (l + r) >> ;
build(l, mid, o * );
build(mid + , r, o * + );
sum[o] = sum[o * ] + sum[o * + ];
} void update(int L, int R, int v, int l, int r, int o)
{
if (L <= l && r <= R)
{
tag[o] += v;
sum[o] += v * (r - l + );
return;
}
pushdown(l, r, o);
int mid = (l + r) >> ;
if (L <= mid)
update(L, R, v, l, mid, o * );
if (R > mid)
update(L, R, v, mid + , r, o * + );
sum[o] = sum[o * ] + sum[o * + ];
} long long query(int L, int R, int l, int r, int o)
{
if (L <= l && r <= R)
return sum[o];
if (L > r || R < l)
return ;
pushdown(l, r, o);
int mid = (l + r) >> ;
return query(L, R, l, mid, o * ) + query(L, R, mid + , r, o * + );
} int main()
{
scanf("%lld%lld", &n, &m);
build(, n, ); for (int i = ; i <= m; i++)
{
int id, x, y, k;
scanf("%d", &id);
if (id == )
{
scanf("%d%d%d", &x, &y, &k);
update(x, y, k, , n, );
}
if (id == )
{
scanf("%d%d", &x, &y);
printf("%lld\n", query(x,y,,n,));
}
} return ;
}
洛谷P3372 【模板】线段树 1的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷 - P1198 - 最大数 - 线段树
https://www.luogu.org/problemnew/show/P1198 要问区间最大值,肯定是要用线段树的,不能用树状数组.(因为没有逆元?但是题目求的是最后一段,可以改成类似前缀和啊 ...
- 洛谷 P2391 白雪皑皑 线段树+优化
题目描述: 现在有 \(N\) 片雪花排成一列. Pty 要对雪花进行$ M $次染色操作,第 \(i\)次染色操作中,把\((i*p+q)%N+1\) 片雪花和第\((i*q+p)%N+1\)片雪花 ...
- 【洛谷】【线段树】P1471 方差
[题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...
- 【洛谷】【线段树】P1047 校门外的树
[题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...
- 【洛谷】【线段树】P1886 滑动窗口
[题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...
- 【洛谷】【线段树】P3353 在你窗外闪耀的星星
[题目描述:] /* 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀 ...
- 洛谷P5280 [ZJOI2019]线段树
https://www.luogu.org/problemnew/show/P5280 省选的时候后一半时间开这题,想了接近两个小时的各种假做法,之后想的做法已经接近正解了,但是有一些细节问题理不 ...
- 洛谷P3374(线段树)(询问区间和,支持单点修改)
洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...
- 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)
题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...
随机推荐
- c#用牛顿法计算根号下2的值
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ubuntu下命令行打开pdf/doc/ppt文件
1 打开pdf evince *.pdf 2 打开ppt libreoffice *.ppt3 打开doc libreoffice *.doc
- having和where的区别
HAVING子句的使用. 例子: SELECT mob_belong_to,user_id,MAX(BIRTH_DATE) FROM user_base_info WHERE sign_in_date ...
- Android Preference
http://blog.csdn.net/liuhe688/article/details/6448423 这个被google废弃了,替换方案是?
- Linux的find命令
使用find命令,可以指定问及那的名称.类别.时间.大小以及权限等,来查找出你想要的文件 语法: fiind [路径] [参数] [-print] 参数详解: 1.-name 按照文件名查找文件 ...
- C++静态成员函数小结(转)
类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...
- WOJ-1203
Description 有一组数,很多很多个数,里面有一个数出现了超过一半次,请你把它找出来 Input 先是一个N (N<=1000000),然后接下来一行N个数,请一直处理到EOF. Out ...
- 关于配置服务器(IIS7)(二)
然 ,你以为这样就解决问题了? 图样 图森破(too yong too simply).......... HTTP 错误 500.21 - Internal Server Error 处理程序“Pa ...
- Java笔记4-do while循环,break,修饰符,方法的调用
do while循环语法:do{ //循环体}while(条件表达式); 注:它是先执行循环体,后再判断的循环结构. 如:int i = 0;do{ System.out.println(" ...
- hdu1018
可以用斯特林公式直接求出n!的结果. 当n较小时公式已经很准确了,所以可以使用.但是,对于这种极限值为1的公式,只能用来估计位数,不能作为严格的等于的公式.类似的有素数分布定理 x/ln(x)~f( ...