线段树 区间更新(更新区间[x,y]的值,再求任意区间[x,y]的和)
描述
对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho:
假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi。小Hi的每次操作分为两种可能,第一种是修改价格——小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP。第二种操作是询问——小Hi给出一段区间[L, R],而小Ho要做的便是计算出所有标号在这段区间中的商品的总价格,然后告诉小Hi。
那么这样的一个问题,小Ho该如何解决呢?
输入
每个测试点(输入文件)有且仅有一组测试数据。
每组测试数据的第1行为一个整数N,意义如前文所述。
每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品的重量Pi。
每组测试数据的第3行为一个整数Q,表示小Hi进行的操作数。
每组测试数据的第N+4~N+Q+3行,每行分别描述一次操作,每行的开头均为一个属于0或1的数字,分别表示该行描述一个询问和一次商品的价格的更改两种情况。对于第N+i+3行,如果该行描述一个询问,则接下来为两个整数Li, Ri,表示小Hi询问的一个区间[Li, Ri];如果该行描述一次商品的价格的更改,则接下来为三个整数Li,Ri,NewP,表示标号在区间[Li, Ri]的商品的价格全部修改为NewP。
对于100%的数据,满足N<=10^5,Q<=10^5, 1<=Li<=Ri<=N,1<=Pi<=N, 0<Pi, NewP<=10^4。
输出
对于每组测试数据,对于每个小Hi的询问,按照在输入中出现的顺序,各输出一行,表示查询的结果:标号在区间[Li, Ri]中的所有商品的价格之和。
- 样例输入
-
- 10
- 4733 6570 8363 7391 4511 1433 2281 187 5166 378
- 6
- 1 5 10 1577
- 1 1 7 3649
- 0 8 10
- 0 1 4
- 1 6 8 157
- 1 3 4 1557
- 10
- 样例输出
-
- 4731
- 14596
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #define lson l, mid, num << 1
- #define rson mid + 1, r, num << 1 | 1
- using namespace std;
- int const MAX = 1e5 + ;
- int tre[MAX << ], laz[MAX << ];//左乘4
- void push_down(int num)
- {
- tre[num] = tre[num << ] + tre[num << | ];
- }
- void push_down(int num, int ln, int rn)
- {
- if (laz[num])
- {
- tre[num << ] = ln * laz[num];
- tre[num << | ] = rn * laz[num];
- laz[num << ] = laz[num];
- laz[num << | ] = laz[num];
- laz[num] = ;
- }
- return;
- }
- void build(int l, int r, int num)
- {
- laz[num] = ;
- if (l == r)
- {
- scanf("%d", &tre[num]);
- return;
- }
- int mid = (l + r) >> ;
- build(lson);
- build(rson);
- push_down(num);
- return;
- }
- void update(int L, int R, int val, int l, int r, int num)
- {
- if (L <= l && r <= R)
- {
- tre[num] = (r - l + ) * val;
- laz[num] = val;
- return;
- }
- int mid = (l + r) >> ;
- push_down(num, mid - l + , r - mid);
- if (L <= mid)
- update(L, R, val, lson);
- if (mid < R)
- update(L, R, val, rson);
- push_down(num);
- return;
- }
- int query(int L, int R, int l, int r, int num)
- {
- if (L <= l && r <= R)
- return tre[num];
- int mid = (l + r) >> ;
- push_down(num, mid - l + , r - mid);
- int ans = ;
- if (L <= mid)
- ans += query(L, R, lson);
- if (mid < R)
- ans += query(L, R, rson);
- return ans;
- }
- int main()
- {
- int n, q;
- scanf("%d", &n);
- build(, n, );
- scanf("%d", &q);
- while (q--)
- {
- int tp, l, r, val;
- scanf("%d", &tp);
- if (tp == )
- {
- scanf("%d %d %d", &l, &r, &val);
- update(l, r, val, , n, );
- }
- else
- {
- scanf("%d %d", &l, &r);
- printf("%d\n", query(l, r, , n, ));
- }
- }
- system("pause");
- return ;
- }
- 4731
线段树 区间更新(更新区间[x,y]的值,再求任意区间[x,y]的和)的更多相关文章
- HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...
- HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- ACM: Copying Data 线段树-成段更新-解题报告
Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...
- HDU1698_Just a Hook(线段树/成段更新)
解题报告 题意: 原本区间1到n都是1,区间成段改变成一个值,求最后区间1到n的和. 思路: 线段树成段更新,区间去和. #include <iostream> #include < ...
- poj 3468 A Simple Problem with Integers 【线段树-成段更新】
题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...
- HDU-1698-Just a Hook-区间更新+线段树成段更新
In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. T ...
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- 【线段树成段更新-模板】【HDU1698】Just a Hook
题意 Q个操作,将l,r 的值改为w 问最后1,n的sum 为多少 成段更新(通常这对初学者来说是一道坎),需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更 ...
- hdu 4747【线段树-成段更新】.cpp
题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...
随机推荐
- 每天一道算法题(11)——栈的push、pop 序列
题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的. 例如:输入的push 序列是 ...
- queue队列模块
import Queue myqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的 ...
- jquery获取元素在文档中的位置信息以及滚动条位置(转)
jquery获取元素在文档中的位置信息以及滚动条位置 http://blog.csdn.net/qq_34095777/article/details/78750886 原文链接 原创 201 ...
- Educational Codeforces Round 56 (Rated for Div. 2) E(1093E) Intersection of Permutations (树套树,pb_ds)
题意和分析在之前的链接中有:https://www.cnblogs.com/pkgunboat/p/10160741.html 之前补题用三维偏序的cdq的分治A了这道题,但是感觉就算比赛再次遇到类似 ...
- centos系统查看本机IP地址
centos系统查看本机IP地址,输入 ifconfig -a查看 centos查询上网公网IP输入 curl ifconfig.me 命令即可查看 centos查询上网网关IP,tracepath ...
- tomcat启动时加载配置文件 报错
原因: @serice("customerService") 和@Repository(value="customerDao") 解决: 直接@ ...
- 前端学习笔记2017.6.12 CSS控制DIV
前一篇文章中用div布局了豆瓣东西的页面,如果用html代码表示的话大概是这个样子的 <!DOCTYPE html><html><head></head> ...
- python常用uuid模块
uuid.uuid4(),会根据我们当前的网卡和时间生成的一个随机字符串. 注意:uuid.uuid4()生成的是一个对象,需要强转为字符串. uid = str(uuid.uuid4()) #当前网 ...
- C#知识点总结系列:3、C#中Delegate和Event
一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...
- socket socket讲解
socket socket讲解 一.socket是何物? 参考百度百科: http://baike.baidu.com/link?url=4YNURsJLEaL0II79C68gPUoYKliXWJ ...