题目大意:线段树的区间更改与查询,但是涉及到两种区间修改方式,一是给区间中的数全部加上一个数,二是将一个区间全部置为同一个数,然后询问整个区间和。

题目分析:处理好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 (线段树)的更多相关文章

  1. hihocoder 1080 线段树(区间更新)

    题目链接:http://hihocoder.com/problemset/problem/1080 , 两种操作的线段树(区间更新). 这道题前一段时间一直卡着我,当时也是基础不扎实做不出来,今天又想 ...

  2. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  3. codevs 1080 线段树练习 CDQ分治

    codevs 1080 线段树练习 http://codevs.cn/problem/1080/  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 一行N个 ...

  4. wikioi 1080 线段树练习 树状数组

    1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond       题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现 ...

  5. codevs 1080 线段树练习--用树状数组做的

    1080 线段树练习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态 ...

  6. Codevs 1080 线段树练习(CDQ分治)

    1080 线段树练习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 一行N个方格,开始每个格子里都有 ...

  7. codevs——1080 线段树练习

    1080 线段树练习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 一行N个方格,开始每个格子里都有 ...

  8. codevs 1080 线段树练习

    链接:http://codevs.cn/problem/1080/ 先用树状数组水一发,再用线段树水一发 树状数组代码:84ms #include<cstdio> #include< ...

  9. hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  10. hihoCoder #1078 : 线段树的区间修改

    题目大意及分析: 线段树成段更新裸题. 代码如下: # include<iostream> # include<cstdio> # include<cstring> ...

随机推荐

  1. java web 之 web.xml篇

    web.xml文件 标签: 1. <web-app> 顶层标签,所有web.xml必须包含该标签.在该标签中,描述了当前Servlet版本以及其他一些信息. 2. <servlet& ...

  2. Unity优化之减少Drawcall

    简单来说,Drawcall就是屏幕渲染一次所需要的开销,为了较少消耗,提高性能,一般有以下几种方法. 一: 批处理 1.动态批处理 如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处 ...

  3. Xlistview的values下的界面

    <!-- 下拉刷新,上拉加载更多 -->    <string name="xlistview_header_hint_normal">下拉刷新</s ...

  4. MySQL v5.1.72 + v5.6.19

    MYSQL是一个多线程的,结构化查询语言(SQL)数据库服务器.SQL 在世界上是最流行的数据库语言.MySQL 的执行性能非常高,运行速度非常快,并非常容易使用.是一个非常捧的数据库. MySQL ...

  5. MongoDB C#驱动中Query几个方法 (转)

    Query.All("name", "a", "b");//通过多个元素来匹配数组 Query.And(Query.EQ("nam ...

  6. SYN Cookie的原理和实现

          本文主要内容:SYN Cookie的原理,以及它的内核实现. 内核版本:3.6 SYN Flood 下面这段介绍引用自[1]. SYN Flood是一种非常危险而常见的Dos攻击方式.到目 ...

  7. <button>使用注意问题

    最近在项目的上传功能下(IE8)发现了如下的错误: 2015-08-13 09:14:03,396 WARN   [WARN] [http-8080-5] : Handler execution re ...

  8. 如何从SAP中查找BADI

    如何从SAP中查找BADI   如何从SAP中查找BADI http://blog.csdn.net/CompassButton/article/details/1231652 BADI作为SAP的第 ...

  9. C++11 不抛异常的new operator

    在google cpp style guide里面明确指出:we don't use exceptions C++11的noexcept关键字为这种选择提供了便利. C++11以前,提及malloc和 ...

  10. How many instances created in the WebContainer

    When the Servlet container starts, it: reads web.xml; finds the declared Servlets in the classpath; ...