时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

对于小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
样例输出
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 ;
}

线段树 区间更新(更新区间[x,y]的值,再求任意区间[x,y]的和)的更多相关文章

  1. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...

  2. HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. ACM: Copying Data 线段树-成段更新-解题报告

    Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...

  4. HDU1698_Just a Hook(线段树/成段更新)

    解题报告 题意: 原本区间1到n都是1,区间成段改变成一个值,求最后区间1到n的和. 思路: 线段树成段更新,区间去和. #include <iostream> #include < ...

  5. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  6. 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 ...

  7. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

  8. 【线段树成段更新-模板】【HDU1698】Just a Hook

    题意 Q个操作,将l,r 的值改为w 问最后1,n的sum 为多少 成段更新(通常这对初学者来说是一道坎),需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更 ...

  9. hdu 4747【线段树-成段更新】.cpp

    题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...

随机推荐

  1. Serializable 和 parcelable的实现和比较

    首先这个两个接口都是用来序列化对象的 但是两者在性能和应用场合上有区别,parcelable的性能更好,但是在需要保存或者网络传输的时候需要选择Serializable因为parcelable版本在不 ...

  2. PHP的count(数组)和strlen(字符串)的内部实现

    PHP的count(数组)和strlen(字符串)的内部实现上是直接显示一个长度变量,还是重头依次数一遍有多少个元素?关乎我理解这2个函数的效率..希望高人能从php的c源码上讲一讲.没有源码看过源码 ...

  3. ROS Learning-006 beginner_Tutorials 编译ROS程序包

    ROS Indigo beginner_Tutorials-05 编译 ROS 程序包 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04 ...

  4. BuilderPattern(23种设计模式之一)

    设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大 ...

  5. 孕妇的孕周和体重对胎儿游离DNA在母体cfDNA占比的影响

    有一篇文件,研究了孕妇的孕周和体重对 胎儿游离DNA在母体cfDNA中占比的影响 文章名称:Gestational age and maternal weight effects on fetal c ...

  6. SpringMVC多个拦截器

    拦截器三个函数的顺序

  7. 原来腾讯安全中心TP和虚拟机vmware10是有冲突的

    用VMware 10启动linux,总是出现VMware Workstation 不可恢复错误: (vmx)...   然后网上查了好多类似问题始终不能解决.后来发现每次出现这个问题腾讯的TP是启动的 ...

  8. clojure.spec库入门学习

    此文已由作者张佃鹏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. clojure是一门动态类型的语言,在类型检查方面并没有c++/java这种静态类型语言好用,所以多个模块之 ...

  9. js setTime()详解

    来源:http://www.jb51.net/article/35535.htm#t1 setTimeout setTimeout 语法例子 用 setTimeout 来执行 function 不断重 ...

  10. C++期中考试

    第一题1. 补足日期类实现,使得能够根据日期获取这是一年中第多少天.(12分) date.h #ifndef DATE_H #define DATE_H class Date { public: Da ...