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> ...
随机推荐
- CSU 1021 B(Contest #3)
Description 从m个不同元素中取出n (n ≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数.组合数的计算公式如下: C(m, n) = m!/((m - n)!n! ...
- dhtmlxScheduler日历日程控件包括天视图,周视图,月视图,年视图和日程表视图
dhtmlxScheduler 是一个基于Web的类似于Outlook的日历日程控件. 它完全由javascript/js/css编写, 提供类似于MS Outlook Calendar, Apple ...
- CSS实现图片快速等比例缩放,效果佳
初学者在实现图片等比例缩放,通常会使用js编写逻辑来控制高或宽,达到自动缩放的效果. 这里提供一种纯CSS的图片缩放功能,请看代码: <style type="text/css&quo ...
- Oracle GoldenGate 12c实时捕获SQL Server数据
在Oracle GoldenGate 12c中,对一些最新的数据库提供了支持,比如SQL Server 2012/2014,当然12c也支持sql server 2008.主要新增特性有: 捕获进程可 ...
- Screen对象
document.write("Screen-width:"+screen.width+"Screen-height:"+screen.height);docu ...
- Coudera-Manager/CDH的安装和部署
由于之前部署的集群采用的是用apache hadoop的方式来实现,但是考虑到运维的成本问题,下面将apache hadoop转换成cloudera cdh.下面主要讲解一下cloudera cdh的 ...
- 《java作业》
/* 2.编写一个类,该类有一个方法public int f(int a,int b), 该方法返回a和b的最大公约数.然后再编写一个该类的子类, 要求子类重写方法f,而且重写的方法将返回a和b的最小 ...
- 2016-1-6第一个完整APP 私人通讯录的实现 4:编辑联系人
一:建立编辑联系人的controller,并使其拥有模型contact,且有协议.代码如下 #import <UIKit/UIKit.h> #import "contact.h& ...
- [super init]方法的调用
当重新覆盖父类的init方法时,需要调用[super init]方法确认父类中的init是返回一个实例,而不是一个空的实例. 那为什么要调用这个呢? 我得猜测是这样的:因为这是一个初始化方法,需要对对 ...
- POJ 2436 二进制枚举+位运算
题意:给出n头牛的得病的种类情况,一共有m种病,要求找出最多有K种病的牛的数目: 思路:二进制枚举(得病处为1,否则为0,比如得了2 1两种病,代号就是011(十进制就是3)),首先枚举出1的个数等于 ...