初学线段树--区域更新
实现原理:初始的时候,给每个树节点都给一个标记,当你在更新某一段区间的时候,要映入一个标记数组,来标记该树节点更新后是否要将更新其子节点,如果该节点的标记值不为空,则表示要对该节点的子节点进行更新,更新完后取消该节点的标记;反之,则无需更新该节点的子节点,该线段树所对应区间的值可以直接拿来使用。
下面上代码(题目来自nyoj士兵杀敌5):
#include<iostream> #include<cstdio> using namespace std; typedef struct Node { int value; int l; int r; }; Node tree[1000050<<2]; int col[1000050<<2]; int n,c,q; int mi,ni,add,m,n1; void build_tree(int v,int l,int r) { tree[v].l=l; tree[v].r=r; if(l==r) { col[v]=0; tree[v].value=0; return; } int mid=(l+r)/2; build_tree(v<<1,l,mid); build_tree(v<<1|1,mid+1,r); tree[v].value=tree[v<<1].value+tree[v<<1|1].value; } void pushDown(int v) { if(col[v]!=0) { col[v<<1]=col[v<<1|1]=col[v];//标记传给子节点 tree[v<<1].value=(tree[v<<1].r-tree[v<<1].l+1)*col[v]; tree[v<<1|1].value=(tree[v<<1|1].r-tree[v<<1|1].l+1)*col[v]; col[v]=0;//本身撤销标记 } } void update(int v,int vl,int vr,int l,int r,int add) { if(vr<l||vl>r) return; if(l<=vl&&vr<=r) { col[v]=add; tree[v].value+=(vr-vl+1)*add; return; } pushDown(v);//进行更新,将原来的标记撤销,标记到子节点 int mid=(vl+vr)/2; update(v<<1,vl,mid,l,r,add); update(v<<1|1,mid+1,vr,l,r,add); tree[v].value=tree[v<<1].value+tree[v<<1|1].value; } int query(int v,int vl,int vr,int l,int r)//这里注意,查询的时候也必须要进行区域更新,update结束后, {//刚好是子节点的一个区间,这样结束的话标记还残留,因此如果查询的区间不是正好符合该子节点的区间的话 //就必须要进行子节点的更新,不然会出错 if(vl>r||vr<l) return 0; if(l<=vl&&vr<=r) { return tree[v].value; } pushDown(v); int mid=(vl+vr)/2; return query(v<<1,vl,mid,l,r)+query(v<<1|1,mid+1,vr,l,r); } int main() { scanf("%d%d%d",&n,&c,&q); build_tree(1,1,n); for(int i=0;i<c;i++) { scanf("%d%d%d",&mi,&ni,&add); update(1,1,n,mi,ni,add); } for(int i=0;i<q;i++) { scanf("%d%d",&m,&n1); int ans=query(1,1,n,m,n1); printf("%d\n",ans); } return 0; }
相关推荐
5. **排名系统**:基于用户的解题数量和速度,NYOJ通常会设立排行榜,激发学习者的竞争意识和团队合作精神。 6. **社区互动**:用户可以在平台上交流解题思路,讨论技术问题,分享编程经验,形成良好的学习氛围。 ...
### nyoj部分ACM答案解析 #### 背景与目的 本篇文章旨在解析一个针对NYOJ(网络在线裁判系统)中ACM题目解答的示例代码。该代码使用了C++语言,并且主要涉及到了回溯算法的实现。对于初学者来说,通过深入理解这段...
NYOJ(New York Online Judge)是一个在线编程竞赛平台,主要面向ACM(国际大学生程序设计竞赛)的参与者。这个离线版包含了NYOJ的所有题目,为编程爱好者和参赛者提供了一个方便的本地化练习环境。通过爬虫技术,...
例如,如果使用平衡二叉搜索树,插入和查询的时间复杂度可以达到O(logn),而线段树则可以在O(logn)时间内处理区间更新和查询操作。 6. **实战应用**: 这类问题的解决方法不仅适用于矩形,还可以推广到其他二维...
字典树,也被称为Trie树或前缀树,是一种高效的数据结构,尤其适用于字符串相关的查找和插入操作。在计算机科学领域,它被广泛应用在字典、搜索引擎、自动补全功能以及IP路由等方面。Trie树的核心优势在于其能够通过...
标题中的“nyoj16.rar”可能是指一个编程竞赛或者在线判题系统(如NOIP、NYOJ)的问题编号16的题目,而“site:www.pudn.com”通常用于搜索引擎查询,表明这个压缩文件可能来源于PUDN(普渡大学电子论坛)这个网站。...
NYOJ,全称New York Online Judge,是一个在线编程竞赛平台,提供了丰富的ACM竞赛训练题目。离线版的NYOJ可能是将该平台的部分内容打包成CHM文件,方便用户在没有网络的情况下查阅和练习。这个CHM文件可能包含题目的...
双线程动态规划问题,很值得练习。传一个ac代码,测试一下csdn的功能。
由于微信小程序没有方法可以获得当前用户所在城市的信息,所以需要调用方法来获取城市信息,用了两个方法去发送请求并返回城市信息 1. @Controller public class WechatLocationManager { private Logger logger ...
这个小程序的主要目的是为了用户用微信的用户信息登录后将用户信息授权存入自己的数据库中,这样以后每次微信登录得到的code 所得到的 openid 可以在项目的数据库中查到该用户的相关信息。 在测试的过程中,需要用户...
set和map是关联容器,以红黑树实现,用于存储唯一元素并支持快速查找。 2. 迭代器: 迭代器是STL的重要概念,它像指针一样指向容器中的元素,但具有更多操作。例如,可以使用迭代器进行元素的增删查改,遍历容器,...
前期小程序开发只进行到根据微信用户登录获取的code 去微信的API去获取到该用户的openId和session_key,到了第二阶段,老大让我重写OAuthManager的代码来实现微信小程序和微信公众号平台获取用户信息的优化,即将...
该题要求对离散化的线段进行覆盖分析,线段树是一种高效的数据结构,能够支持区间查询和更新操作,适用于此类问题。 #### 10. skiing 经典动态规划题目,旨在寻找最佳路径,这类问题通常需要建立状态转移方程,以...
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。