HihoCoder1078线段树的区间修改(线段树+lazy)
每个测试点(输入文件)有且仅有一组测试数据。
每组测试数据的第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
这里有点小优化,避免了讨论:
本来是 if(r<=Mid) change(now<<,l,r,val);
else if(l>Mid) change(now<<|,l,r,val);
else {
change(now<<,l,Mid,val);
change(now<<|,Mid+,r,val);
}
变成了 if(Mid>=l) change(now<<,l,r,val);
if(Mid<r) change(now<<|,l,r,val);
还有,询问函数里可以不update(now)?反正没加的时候AC了,加了也AC了,道理上应该要加才对啊。。。
虽然结构体的代码可能要长一点,但是看起来真的很舒服啊。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
const int maxn=;
using namespace std;
int a[maxn],n;
struct Node
{
int L,R,lazy,sum,cnt;
Node()
{
L=R=lazy=sum=cnt=;
}
};
struct Tree
{
Node node[maxn<<];
void build(int now,int l,int r)
{
node[now].L=l;
node[now].R=r;
node[now].lazy=;
if(l==r) {
node[now].cnt=;
return ;
}
int Mid=(l+r)>>;
build(now<<,l,Mid);
build(now<<|,Mid+,r);
node[now].cnt=node[now<<].cnt+node[now<<|].cnt;
}
void update(int now)
{
node[now].sum=node[now<<].sum+node[now<<|].sum;
}
void pushdown(int now)
{
node[now<<].lazy=node[now].lazy;
node[now<<].sum=node[now].lazy*node[now<<].cnt;
node[now<<|].lazy=node[now].lazy;
node[now<<|].sum=node[now].lazy*node[now<<|].cnt;
node[now].lazy=;
}
void insert(int now,int pos,int val)
{
if(node[now].L==node[now].R) {
node[now].sum=val;
return ;
}
int Mid=(node[now].L+node[now].R)>>;
if(pos<=Mid) insert(now<<,pos,val);
else insert(now<<|,pos,val);
update(now);
}
void change(int now,int l,int r,int val)
{
if(node[now].lazy) pushdown(now);
if(node[now].L>=l&&node[now].R<=r) {
node[now].lazy=val;
node[now].sum=node[now].cnt*node[now].lazy;
return ;
}
int Mid=(node[now].L+node[now].R)>>;
if(Mid>=l) change(now<<,l,r,val);
if(Mid<r) change(now<<|,l,r,val);
update(now);
return ;
}
int query(int now,int l,int r)
{ if(node[now].L>=l&&node[now].R<=r) return node[now].sum;
if(node[now].lazy) pushdown(now);
int Mid=(node[now].L+node[now].R)>>;
int s=;
if(Mid>=l) s+=query(now<<,l,r);
if(Mid<r) s+=query(now<<|,l,r);
return s;
}
};
Tree tree;
int main()
{
int x,l,r,q,i,opt;
scanf("%d",&n);
tree.build(,,n);
for(i=;i<=n;i++) {
scanf("%d",&a[i]);
tree.insert(,i,a[i]);
}
scanf("%d",&q);
while(q--){
scanf("%d",&opt);
if(opt==){
scanf("%d%d%d",&l,&r,&x);
tree.change(,l,r,x);
}
else {
scanf("%d%d",&l,&r);
printf("%d\n",tree.query(,l,r));
}
}
return ;
}
HihoCoder1078线段树的区间修改(线段树+lazy)的更多相关文章
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- hiho一下20周 线段树的区间修改
线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了 ...
- poj 3468:A Simple Problem with Integers(线段树,区间修改求和)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 58269 ...
- hihoCode 1078 : 线段树的区间修改
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树
https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...
- POJ 2528 - Mayor's posters - [离散化+区间修改线段树]
题目链接:http://poj.org/problem?id=2528 Time Limit: 1000MS Memory Limit: 65536K Description The citizens ...
- 培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)
补坑咯~ 今天围绕的是一个神奇的数据结构:线段树.(感觉叫做区间树也挺科学的.) 线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素. 那么这个线段树有什么优势呢? 比如我们要多次 ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- hihoCoder week20 线段树的区间修改
区间修改 区间查询 最后一场比赛前的无可救药的热身 #include <bits/stdc++.h> using namespace std; #define mid ((l+r)/2) ...
- To the moon HDU - 4348 (主席树,区间修改)
Background To The Moon is a independent game released in November 2011, it is a role-playing adventu ...
随机推荐
- 每天一个Linux命令(64)shutdown命令
shutdown以一种安全的方式关闭系统. (1)用法: 用法: shutdown [参数] [时间] (2)功能: 功能: 系统关机命令,shutdown ...
- 024_MapReduce中的基类Mapper和基类Reducer
内容提纲 1) MapReduce中的基类Mapper类,自定义Mapper类的父类. 2) MapReduce中的基类Reducer类,自定义Reducer类的父类. 1.Mapper类 API文档 ...
- java Excel导入导出工具类
本文章,导入导出依赖提前定义好的模板 package com.shareworx.yjwy.utils; import java.io.File; import java.io.FileInputSt ...
- android 7.0 (nougat)的编译优化-ninja
http://blog.csdn.net/songjam/article/details/52640501 版权声明:本文为博主原创文章,未经博主允许不得转载. 从官方的定义,ninja大大缩短了an ...
- android驱动USB摄像头
http://blog.csdn.net/mirkerson/article/details/50764314 多亏了stackoverflow看到的一篇帖子,其中有几句关键的话,然后顺藤摸瓜解决了问 ...
- Java基础面试集合
1.面向对象的特征有哪些方面? 抽象 封装 继承 多态,多态性是指允许不同子类型的对象对同一消息作出不同的响应.简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情.多态性分为编译时的多态性和 ...
- QGIS3.0.3+Qt5.9+VS2015_x64编译
QGIS3.0.3+Qt5.9+VS2015_x64编译 参考:https://blog.csdn.net/u010670734/article/details/80241615 https://ww ...
- 获取CPU利用率
#define MB (1024 * 1024) MEMORYSTATUSEX statex; statex.dwLength = sizeof (statex); GlobalMemoryStatu ...
- Python 数值类型
1.数值类型分为整形(二进制(0b),八进制(0o),十进制,十六进制(0x) ),浮点型,long,complex(复合行) 当我们说十进制数的时候,是逢10进1,就是说到达10的时候就要向前一位进 ...
- Java线程池ExecutorService和CountDownLatch的小例子
import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java ...