hihoCoder#1080 (线段树)
题目大意:线段树的区间更改与查询,但是涉及到两种区间修改方式,一是给区间中的数全部加上一个数,二是将一个区间全部置为同一个数,然后询问整个区间和。
题目分析:处理好set操作和add操作的先后顺序就OK了。
代码如下:
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std; const int N=100001; int n,m;
int tr[N*4+5];
int lazy_set[N*4+5];
int lazy_add[N*4+5]; void pushDown(int rt,int l,int r)
{
int mid=l+(r-l)/2;
if(lazy_set[rt]!=0){
lazy_set[rt<<1]=lazy_set[rt<<1|1]=lazy_set[rt];
lazy_add[rt<<1]=lazy_add[rt<<1|1]=0;
tr[rt<<1]=lazy_set[rt]*(mid-l+1);
tr[rt<<1|1]=lazy_set[rt]*(r-mid);
lazy_set[rt]=0;
}
if(lazy_add[rt]!=0){
lazy_add[rt<<1]+=lazy_add[rt];
lazy_add[rt<<1|1]+=lazy_add[rt];
tr[rt<<1]+=lazy_add[rt]*(mid-l+1);
tr[rt<<1|1]+=lazy_add[rt]*(r-mid);
lazy_add[rt]=0;
}
} void makeTree(int rt,int l,int r)
{
if(l==r){
scanf("%d",&tr[rt]);
}else{
int mid=l+(r-l)/2;
makeTree(rt<<1,l,mid);
makeTree(rt<<1|1,mid+1,r);
tr[rt]=tr[rt<<1]+tr[rt<<1|1];
}
} void update(int rt,int l,int r,int L,int R,int x,int flag)
{
if(L<=l&&r<=R){
if(flag){
lazy_set[rt]=x;
lazy_add[rt]=0;
tr[rt]=x*(r-l+1);
}else{
lazy_add[rt]+=x;
tr[rt]+=x*(r-l+1);
}
}else{
pushDown(rt,l,r);
int mid=l+(r-l)/2;
if(L<=mid)
update(rt<<1,l,mid,L,R,x,flag);
if(R>mid)
update(rt<<1|1,mid+1,r,L,R,x,flag);
tr[rt]=tr[rt<<1]+tr[rt<<1|1];
}
} int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(lazy_set,0,sizeof(lazy_set));
memset(lazy_add,0,sizeof(lazy_add));
makeTree(1,0,n);
int flag,l,r,v;
while(m--)
{
scanf("%d%d%d%d",&flag,&l,&r,&v);
update(1,0,n,l,r,v,flag);
printf("%d\n",tr[1]);
}
}
return 0;
}
hihoCoder#1080 (线段树)的更多相关文章
- hihocoder 1080 线段树(区间更新)
题目链接:http://hihocoder.com/problemset/problem/1080 , 两种操作的线段树(区间更新). 这道题前一段时间一直卡着我,当时也是基础不扎实做不出来,今天又想 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1080 线段树练习 CDQ分治
codevs 1080 线段树练习 http://codevs.cn/problem/1080/ 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 一行N个 ...
- wikioi 1080 线段树练习 树状数组
1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现 ...
- codevs 1080 线段树练习--用树状数组做的
1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态 ...
- Codevs 1080 线段树练习(CDQ分治)
1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 一行N个方格,开始每个格子里都有 ...
- codevs——1080 线段树练习
1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 一行N个方格,开始每个格子里都有 ...
- codevs 1080 线段树练习
链接:http://codevs.cn/problem/1080/ 先用树状数组水一发,再用线段树水一发 树状数组代码:84ms #include<cstdio> #include< ...
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- hihoCoder #1078 : 线段树的区间修改
题目大意及分析: 线段树成段更新裸题. 代码如下: # include<iostream> # include<cstdio> # include<cstring> ...
随机推荐
- AbstractMap学习记录
package java.util;import java.util.Map.Entry; /** * This class provides a skeletal implementation of ...
- matlab 画框(二) 去白边
在matlab图像处理中,为了标识出图像的目标区域来,需要利用plot函数或者rectangle函数,这样标识目标后,就保存图像. 一般saves保存的图像存在白边,可以采用imwrite对图像进行保 ...
- [Java]Java简介
Java版本历史 1995年5月23日,Java语言诞生 1996年1月,第一个JDK1.0诞生 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术 1996年9月,约8.3 ...
- uitabbarcontroller中 在设置tab bar item的image属性后不显示问题
开始使用ios中的UITabBarController,在给Tab Bar Item设置自定义图片的时候,遇到了问题 按照如下配置: 出来的结果确是: 实际上test24.png应该是: 纠结了很久, ...
- paramiko堡垒机、线程及锁
1.使用paramiko实现ssh连接和scp拷贝 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 1.1 SSHClient 用于连接远 ...
- copy和assign的使用和区别
1.使用copy和assign都可以进行修饰属性或者变量. 2.区别: (1)copy的使用:使用这个进行修饰的属性,当已经进行初始化之后,就无法再改变属性的数据. 如: @property (cop ...
- vijos 1780 开车旅行
细节巨多. 倍增即可. #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- WebService是什么?
一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...
- MySQL数据库备份和还原的常用命令小结
备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql 备份MySQL数据库 ...
- JS删除HTML元素问题
<div id='one'> <div>1</div> <div>2</div> </div> <div id=" ...