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 ...
随机推荐
- $用python玩点有趣的数据分析——一元线性回归分析实例
Refer:http://python.jobbole.com/81215/ 本文参考了博乐在线的这篇文章,在其基础上加了一些自己的理解.其原文是一篇英文的博客,讲的通俗易懂. 本文通过一个简单的例子 ...
- 40个你可能不知道的Python的特点和技巧
1.拆箱 >>> a, b, c = 1, 2, 3 >>> a, b, c (1, 2, 3) >>> a, b, c = [1, 2, 3] ...
- 跨平台移动开发 手机上使用Iscroll.Js的Banner
二话不说,直接上图,看效果 需要使用Iscroll <script src="content/scripts/iscroll.js"></script> 示 ...
- cocos2dx打飞机项目笔记一:项目结构介绍
最近在学习cocos2dx引擎,版本是2.1.3,开发环境是win7 + vs2010,模仿微信打飞机游戏,开发中参考了 csdn 偶尔e网事 的系列文章:http://blog.csdn.net/c ...
- [C++] 麻将胡牌算法
麻将的玩法规则众多,核心的玩法是一致的,本文将根据联发科2017年编程挑战赛的复赛题规则来实现. 牌的表示方式 ABCDEFGHI代表一到九萬,abcdefghi代表一到九条,123456789代表一 ...
- 谈谈 cci 与 i2c
cci的名字叫, camera control interface, 他由两部分组成,一是i2c ,而另一个部分是 gpio.也就是说,cci 包含i2c.一般情况下,我们只是用到了i2c 部分,没有 ...
- .NET CORE 动态调用泛型方法
using System; using System.Reflection; namespace DynamicCall { class Program { static void Main(stri ...
- RHCE学习笔记 管理1 (第三~五章)
第三章 红帽企业linux 获取帮助 (略) man .pinfo. 第四章 编辑文件 1.输出重定向到文件和程序 >file 定向文件(覆盖) >>file 定向文件(附 ...
- 通用Mapper(Mybatis)
1.Mapper的简单介绍 2.Mapper的作用 通用Mapper可以通过Mybatis的拦截器原理,动态的帮我们实现单表的增删改查功能,大大降低了我们的开发成本,减少了我们的工作量. 3.Mapp ...
- 【bzoj2423】最长公共子序列[HAOI2010](dp)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2423 题目大意:求两个字符串的最长公共子序列长度和最长公共子序列个数. 这道题的话,对于 ...