线段树的区间修改

时间限制: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 <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define inf 2e9
#define met(a,b) memset(a,b,sizeof a)
typedef long long ll;
using namespace std;
const int N = 1e7+;
const int M = 4e6+;
int n,sum[N],m;
int Tree[N],lazy[N];
void pushup(int pos) {
Tree[pos]=Tree[pos<<]+Tree[pos<<|];
}
void pushdown(int pos,int l,int r){
if(lazy[pos]){
Tree[pos<<]=l*lazy[pos];
Tree[pos<<|]=r*lazy[pos];
lazy[pos<<]=lazy[pos];
lazy[pos<<|]=lazy[pos];
lazy[pos]=;
}return;
}
void build(int l,int r,int pos) {
lazy[pos]=;
if(l==r) {
scanf("%d",&Tree[pos]);
return;
}
int mid=(l+r)>>;
build(l,mid,pos<<);
build(mid+,r,pos<<|);
pushup(pos);
return;
}
void update(int L,int R,int val,int l,int r,int pos) {
if(l>=L&&r<=R) {
Tree[pos]=val*(r-l+);
lazy[pos]=val;
return;
}
int mid=(l+r)>>;
pushdown(pos,mid-l+,r-mid);
if(L<=mid) update(L,R,val,l,mid,pos<<);
if(mid<R)update(L,R,val,mid+,r,pos<<|);
pushup(pos);
}
int query(int L,int R,int l,int r,int pos) {
if(L<=l&&r<=R)return Tree[pos];
int mid=(l+r)>>;
pushdown(pos,mid-l+,r-mid);
int ans=;
if(L<=mid) ans+=query(L,R,l,mid,pos<<);
if(R>mid) ans+=query(L,R,mid+,r,pos<<|);
return ans;
}
int main() {
scanf("%d",&n);
build(,n,);
scanf("%d",&m);
int sign,l,r,val;
while(m--) {
scanf("%d",&sign);
if(sign) {
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,));
}
}
return ;
}

最新文章

  1. /usr/include/sys/types.h:62: error: conflicting types for ‘dev_t’
  2. 对C语言中指针的一些新认识
  3. 教你快速高效接入SDK——总体思路和架构
  4. ffmpeg编译x264, 这个libffmpeg即可解码又可以h264编码
  5. omnetpp inet
  6. .Net 应用程序如何在32位操作系统下申请超过2G的内存【转】
  7. OpenGL超级宝典第5版&amp;&amp;GLSL法线变换
  8. PHP 下载网络图片
  9. 在 Ubuntu 12.04 上通过安装源安装 Open vSwitch (OVS)
  10. SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析)
  11. JavaScript 开发工具webstrom使用指南
  12. RAID 构建
  13. Android破解心得——记学习七少月安卓大型安全公开课
  14. 详解mybatis配置文件
  15. Java自增和自减操作符——++/--的那些事
  16. 微信小程序 TLS 版本必须大于等于1.2问题解决
  17. pytorch加载预训练模型参数的方式
  18. 【NOI 2015】品酒大会
  19. 玩玩vs Git 中国版 Gitee
  20. acm 比赛模板

热门文章

  1. Python 2.7 因为少写括号导致的 SyntaxError 错误
  2. 关于TortoiseGit使用的心得
  3. placeholder 不支持IE修复
  4. js报错:email() is not a function
  5. jquery checkbox实例
  6. 例子:Basic Lens sample
  7. Delphi编译的程序如何获取管理员权限
  8. 关于升级xcode8
  9. MySQL数据库3 - MySQL常用数据类型
  10. 视频控件VideoView的简单使用