#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define M 1000005
struct tree{
int left,right,sum,lazy;
};
tree g[M];
int map[M];
void pushDown(int i)
{
if(g[i].lazy)
{
g[2*i].lazy=1;
g[2*i+1].lazy=1;
g[i].lazy=0;
g[2*i].sum=g[i].sum/(g[i].right-g[i].left+1)*(g[2*i].right-g[2*i].left+1);
g[2*i+1].sum=g[i].sum/(g[i].right-g[i].left+1)*(g[2*i+1].right-g[2*i+1].left+1);
}
}
void buildTree(int left,int right,int i)
{
int mid;
g[i].lazy=0;
g[i].left=left;
g[i].right=right;
if(left==right)
{
g[i].sum=map[left];
return ;
}
mid=(left+right)/2;
buildTree(left,mid,2*i);
buildTree(mid+1,right,2*i+1);
g[i].sum=g[2*i].sum+g[2*i+1].sum;
}
void insert(int l,int r,int num,int i)
{
if(g[i].lazy) pushDown(i);
if(l==g[i].left && g[i].right==r)
{
g[i].sum=(g[i].right-g[i].left+1)*num;
g[i].lazy=1;
return ;
}
int mid=(g[i].left+g[i].right)/2;
if(r<=mid)
insert(l,r,num,2*i);
else if(mid<l)
insert(l,r,num,2*i+1);
else
{
insert(l,mid,num,2*i);
insert(mid+1,r,num,2*i+1);
}
g[i].sum=g[2*i].sum+g[2*i+1].sum;
}
int search(int l,int r,int k)
{
int mid;
if(g[k].lazy) pushDown(k);
if(l==g[k].left && r==g[k].right)
return g[k].sum;
mid=(g[k].left+g[k].right)/2;
if(r<=mid)
search(l,r,2*k);
else if(l>mid)
search(l,r,2*k+1);
else
return search(l,mid,2*k)+search(mid+1,r,2*k+1);
}
int main()
{
int i,m,n,f,l,r,price;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&map[i]);
buildTree(1,n,1);
scanf("%d",&m);
while(m--)
{
scanf("%d",&f);
if(f==1)
{
scanf("%d%d%d",&l,&r,&price);
insert(l,r,price,1);
}
else
{
scanf("%d%d",&l,&r);
printf("%d\n",search(l,r,1));
}
}
}
return 0;
}
[/size]
分享到:
相关推荐
线段树区间更新代码线段树区间更新代码线段树区间更新代码线段树区间更新代码
线段树是一种高效的数据结构,常用于处理区间查询与更新问题。它的核心思想是将一个一维数组通过分治策略转化为一棵二叉树,每个节点代表一个区间的值,这棵树通常具有平衡性质,比如平衡二叉搜索树的特性。线段树在...
- 如果操作是修改(由字符'A'标识),则调用`revise`函数更新线段树。 - 如果操作是查询(不包含'A'),调用`getmin`函数找到指定区间内的最小值并输出。 在处理完所有操作后,程序结束。 区间线段树的优势在于它...
其中,线段树(Segment Tree)是一种高效的数据结构,常被用于处理区间查询或更新的问题。在本篇文章中,我们将深入探讨“点节点更新线段树”的概念、原理以及实现细节,尤其关注单点更新操作。 ### 点节点更新线段...
线段树是一种非常有效的数据结构,主要用于解决区间查询和更新的问题,常用于算法竞赛和实际应用中的问题求解。接下来,我们将详细探讨“线段树六题”中各个题目的相关知识点。 ### 1. PKU2352 star2 校门外的树 **...
线段树,作为一种高效的数据结构,广泛应用于计算机科学和算法设计中,特别是在处理区间查询和更新问题时。它能够以O(logN)的时间复杂度完成区间内的查询与修改操作,大大提高了程序的运行效率。本资源包含了一些...
- **更新操作**:当添加新的矩形时,可以通过更新线段树来反映新增矩形对轮廓的影响。 - **优势**:利用线段树进行管理,可以在O(log N)的时间复杂度内完成查询和更新操作,大大提高了算法的整体效率。 #### 结论 ...
2. **区间加法更新** (`range addition update`): 在某些情况下,我们需要更新某个区间内的元素值,可以通过在线段树上打上标记的方式来快速完成,而不是逐个更新每个元素。 #### 六、总结 线段树是一种非常强大的...
例如,在处理地图数据时,可以先用矩形切割将大范围的地理区域划分成小块,然后对每个小块建立线段树,这样就可以快速查询和更新特定区域的信息。 在《薛矛.ppt》这个文件中,可能详细讲解了线段树的构造、查询和...
线段树通过“懒惰标记”技术优化了区间修改,避免了不必要的递归更新,提高了效率。 二分法,又称折半搜索,是一种在有序数组中查找特定元素的搜索算法。在线段树中,二分法可以用于定位区间操作的位置,例如在寻找...
ACM线段树基本 线段树是一种常用的数据结构,广泛应用于算法竞赛编程和数据结构设计中。它是一种树形结构,能够高效地进行区间查询和修改操作。 线段树的基本概念 线段树是一棵二叉树,每个结点表示一个区间。...
离散化是处理大规模数据时的一个技巧,它可以将数据映射到一个较小的范围内,从而减少线段树的空间需求,并可能加快查询和更新的效率。 扫描线技术是处理与线段树相关的一些问题时使用的,它用于动态处理线段树中的...
浙江大学_acm程序设计竞赛_培训_线段树浙江大学_acm程序设计竞赛_培训_线段树浙江大学_acm程序设计竞赛_培训_线段树浙江大学_acm程序设计竞赛_培训_线段树浙江大学_acm程序设计竞赛_培训_线段树浙江大学_acm程序设计...
线段树是一种高效的数据结构,常用于解决区间查询与更新的问题。在计算机科学和编程竞赛中,线段树是常用工具之一,特别是在处理动态区间问题时。ZKW线段树,由ZKW(Zhang Kewei)提出,是线段树的一种优化模板,它...
**应用场景**:二维线段树适用于需要在二维空间中处理区间查询的问题,例如查询矩形区域内的某些统计信息。 #### 六、线段树与树状数组的应用实例 **示例**:考虑一个包含 `n` 个元素的数组,需要支持以下两种操作...
- `ohdu1754 I Hate It`:虽然题目描述未给出,但根据上下文,可以推测这同样是一个涉及到线段树的更新和查询的问题。 线段树的优化还包括懒惰标记(Lazy Propagation)技术,用于处理连续的区间更新,避免不必要的...
- **插入**:插入一条线段 `[c, d]` 到线段树中,通过比较线段与当前节点区间的相对位置,递归地向子节点进行插入操作,同时更新节点的 `cover` 字段。 - **删除**:删除线段 `[c, d]` 时,同样比较线段与当前节点...
### 线段树高级数据结构实现:点更新 #### 一、线段树简介 线段树是一种高效的数据结构,常用于处理区间查询或区间更新的问题。它将一个线性序列分割成多个部分,每个节点代表一个区间的统计信息(如最大值、...
在本篇博文中,我们将深入探讨线段树的概念,以及如何实现懒惰更新(Lazy Propagation)策略,同时结合POJ1823问题进行实战应用。懒惰更新是优化线段树性能的关键技巧,它避免了频繁地对每个节点进行更新,从而减少...
线段树可以高效地解决许多问题,如区间查找、区间更新、区间统计等。但是,对于线段树的理解和应用,需要对其构造思想、数据结构和运用场景有深入的掌握。 线段树的构造思想 线段树是一棵二叉树,树中的每一个结点...