区改区查标记永久化线段树

写完树剖之后发现还没有讲过区改区查线段树。。。

标记永久化线段树的用处:

支持区改区查,嗯,就这样。(不过听很多dalao说这种线段树有利于写主席树)

算法核心思路:

对于一段区间加,假如它把线段树上的一部分完全包涵,那么我们就把它“永久”的加在这部分上,否则就加在另外一个神奇的地方,这个神奇的地方只有当询问区间将其完全包涵才能加。

这样我们就把区间加变成了log级别的。

代码实现:

procedure update(k,l,r,x,y,z:longint);
var
    mid:longint;
begin
    if (l>=x)and(r<=y) then
    begin
        add_sum[k]:=(add_sum[k]+z)mod p; exit;               //完全包涵,把标记永久化。
    end;
    sum[k]:=(sum[k]+(min(r,y)-max(l,x)+1)*z mod p)mod p;     //加到一个神奇的地方(我们可以叫它半永久标记,好吧我瞎掰的。。。)
    mid:=(l+r)>>1;
    if x<=mid then update(k*2,l,mid,x,y,z);                  //像普通线段树的查询操作一样继续更新其他节点,直到需要我们修改的区间全部被永久化为止
    if y>mid then update(k*2+1,mid+1,r,x,y,z);
end;
function query(k,l,r,x,y:longint):longint;
var
    mid:longint;
begin
    if (l>=x)and(r<=y) then exit((sum[k]+(r-l+1)*add_sum[k]mod p)mod p);
    mid:=(l+r)>>1;
    query:=(min(r,y)-max(l,x)+1)*add_sum[k]mod p;
    if x<=mid then query:=(query+query(k*2,l,mid,x,y))mod p;
    if y>mid then query:=(query+query(k*2+1,mid+1,r,x,y))mod p;
end;

原文地址:https://www.cnblogs.com/WR-Eternity/p/9901158.html

时间: 2024-10-11 09:36:01

区改区查标记永久化线段树的相关文章

Codeforces Round #423 (Div. 2) C 思维,并查集 或 线段树 D 树构造,水

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction   思维,并查集 或 线段树 题意:一个字符串被删除了,但给出 n条信息,要还原出可能的字典序最小的字符串.信息有:字符串ti,ki个位置xi,表明原本的字符串在xi位置是以字符串ti开头的. tags:惨遭 fst,一开始把所有字符串都存下来,排序做的,结果爆内存了.. 方法1: 考虑并查集,对于字符串 ti,在位置xi,

HDU1698 just a Hook - 带有lazy标记的线段树

2017-08-30 16:44:33 writer:pprp 上午刚刚复习了一下不带有lazy标记的线段树, 下午开始学带有lazy标记的线段树 这个是我看大佬代码敲的,但是出了很多问题, 这提醒我: 1.要注意边界条件,一个边界条件的取等或者不取等,小于或者大于出错的话就直接运行不了了 2.注意输入输出,经过多次测试,果然还是用scanf比较保险,试了试用fast_io的cin结果还是TLE 所以以后不要用cin了,cin害人啊,两个混用就更加麻烦了 这个题就是区间修改,区间查询的一道题,但

ACM学习历程—SNNUOJ 1110 传输网络((并查集 &amp;&amp; 离线) || (线段树 &amp;&amp; 时间戳))(2015陕西省大学生程序设计竞赛D题)

Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的.现在他们开始在其他城市陆 续建立了新的基站,命令“C x“代表在城市x建立了一个新的基站,不会在同一个城市建立多个基站:城市编号为1到n,其中城市1就是首都Bytetown.在建立基站的过程中他们还 会询问某个城市的网络信号是从哪个城市传输过来的,命令”Q x“代表查询城市x的来源城市. Inpu

HDU 3974 Assign the task 并查集/图论/线段树

Assign the task Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3974 Description There is a company that has N employees(numbered from 1 to N),every employee in the company has a immediate boss (except for the l

具有增、删、改、查功能的vue-tree树组件

最近写了一个具有增删改查功能的多级树组件,感觉很实用,啦啦啦啦, 废话不多说,看代码: tree.vue 1 <template> 2 <div> 3 <div class="all-div" v-if="model.name"> 4 <div class="itemRow" :style="{ marginLeft:model.level*20+'px' }"> 5 <s

[HDU5306]Gorgeous Sequence(标记回收线段树)

题意:维护一个序列,支持区间与一个数取min,询问区间最大,询问区间和(序列长度<=1e6) 分析: http://www.shuizilong.com/house/archives/hdu-5306-gorgeous-sequence/?variant=zh-cn 在建树的时候,就已经生成了lazy标记,具体的参加jry的16年集训队论文 这样使得lazy标记有了这一样一个性质:子节点向上走碰到的第一个lazy的值就是此节点的值 打标记操作: 标记回收操作:

[hdoj4578][多延迟标记的线段树]

Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)Total Submission(s): 9392    Accepted Submission(s): 2408 Problem Description Yuanfang is puzzled with the question below: There are n integers, a1, a2

带有lazy标记的线段树

#include<bits/stdc++.h> using namespace std; int n,m,x,y,val,com,s[100000]; struct st{ int l,r,val,add; }tr[10000000]; void build(int l,int r,int k) { tr[k].l=l; tr[k].r=r; if(l==r) { tr[k].val=s[l]; return; } int mid=(l+r)>>1; build(l,mid,k&l

[知识点]线段树标记永久化

前言: 本文由Hallmeow原创,转载请注明出处! 由于打丧心病狂的 [BZOJ 4826]影魔  导致需要学习标记永久化,于是入坑OvO 知识点:线段树标记永久化 对于树套树,主席树等使用到线段树的比较复杂的数据结构,如果我们区间修改的话,打标记后pushdown或者pushup是很费劲的 那么我们能不能不用pushdown和pushup呢?当然可以啦!这样就用到标记永久化了! 原理就是: 在路过该节点的时候把修改对答案的影响加上,来省去标记下放的过程 实现起来: 线段树的每个节点维护 su