首页 > 其他分享 >线段树区间和,区间修改,区间查询板子

线段树区间和,区间修改,区间查询板子

时间:2023-04-12 18:47:41浏览次数:52  
标签:return int 线段 nd ret 板子 区间 sum

#include <bits/stdc++.h>

using namespace std;

using LL = long long;

#define lson (nd<<1)
#define rson (nd<<1|1)
#define mid (l+r>>1)

const int N = 1e5+5;

int sum[N<<2], lazy[N<<2];

int a[N];

void build(int nd, int l, int r){
    if(l==r){
        sum[nd]=a[l];
        return;
    }

    build(lson, l, mid);
    build(rson, mid+1, r);
    sum[nd] += sum[lson] + sum[rson];
}


void push_down(int nd, int l, int r){
    if(lazy[nd]){
        lazy[lson] += lazy[nd];
        lazy[rson] += lazy[nd];
        sum[lson] += (mid-l+1) * lazy[nd];
        sum[rson] += (r-mid) * lazy[nd];
        lazy[nd] = 0;
    }
}

void update(int nd, int l, int r, int L, int R, int val){
    if(L<=l&&R>=r){
        sum[nd] += (r-l+1) * val;
        lazy[nd] += val;
        return;
    }
    push_down(nd, l, r);
    if(L<=mid){
        update(lson, l, mid, L, R, val);
    }
    if(R>mid){
        update(rson, mid+1, r, L, R, val);
    }

    sum[nd] = sum[lson] + sum[rson];
}

int query(int nd, int l, int r, int L, int R){
    if(l>=L&&R>=r){
        return sum[nd];
    }
    push_down(nd, l, r);
    int ret=0;
    if(L<=mid){
        ret+=query(lson, l, mid, L, R);
    }
    if(R>mid){
        ret+=query(rson, mid+1, r, L, R);
    }

    return ret;
}

int n;

int main(){
    cin >> n;
    for(int i=1;i<=n;++i){
        cin >> a[i];
    }

    build(1, 1, n);
    update(1, 1, n, 1, 3, -1);
    update(1, 1, n, 2, 5, 1);
    
    return 0;
}

标签:return,int,线段,nd,ret,板子,区间,sum
From: https://www.cnblogs.com/JohnRan/p/17310789.html

相关文章

  • 广州大学第十七届ACM大学生程序设计竞赛 L. 因子模仿 - hard version 线段树维护矩阵
    传送门大致思路:  观察发现,茉美香胜利会叠加对手所有状态,茉美香失败会被对手叠加所有状态。我们可以用矩阵[a1,a2,b1,b2]表示两个人的状态(其中a1,a2表示茉美香,b1,b2表示对手)茉美香赢了之后的状态是[a1+b1,a2+b2,b1,b2],茉美香输了之后的状态是[a1,b1,a1+b1,......
  • 线段树之扫描线
    P5490【模板】扫描线给你n个位于平面直角坐标系上的长方形,它们之间可能互相重叠,求这些长方形的面积。很显然,对于长方形之间有重叠部分,如果采用容斥原理,不仅非常复杂,而且难以实现。事实上,既然题目已经给了我们这些长方形的顶点,这些长方形最终构成的图形可以被坐标轴划分为m......
  • 线段树分治
    线段树分治线段树分治,解决的是这样一类问题:有一个时间轴,有一些操作,这些操作在时间轴上每一个的作用范围是一个区间;在某些时间或者全局询问一些关于操作效果的问题。它的重要效果是:一是可以把所有删除操作改成撤回操作(也就是撤回当前最近一个操作,而不是删除之前随便一个操作),可以......
  • hdu-4533(线段树+区间合并)
    约会安排HDU-4553跟hdu-1540(线段树+区间合并)-魏老6-博客园(cnblogs.com)是一样,但是要写两个线段树。线段树维护,最长前缀pre,最长后缀suf,以及最大连续连续区间sum。1代表空,0代表时间被占了还有几个注意事项:当是DS时,只能查询和修改屌丝树;当是NS时,先判断屌丝树能不......
  • leetcode56.合并区间-java
    1classSolution{2publicint[][]merge(int[][]intervals){3/*4思路:左区间排序,若intervals[i][0]>=intervals[i-1][1];则重叠5将重叠区间新建放入res数组里,没重叠则放入原数组6*/7List<int[]>......
  • 可持久化线段树(主席树)
              代码#include<bits/stdc++.h>usingnamespacestd;constintN=4e7+10;intn,m,t,top,rt,mode,x,y;intf[N],a[N],root[N];structkkk{intl,r,val;}tree[N];intclone(intnode){top++;tree[top]=tree[node];return......
  • poj-3367(线段树+区间合并)
    HotelPOJ-3667思路:与hdu-1540(线段树+区间合并)-魏老6-博客园(cnblogs.com)类似,只不过是区间修改,多维护一个最大连续区间sum。#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<fstream>#include<iostream>#include<cstdio>#include<deque>#includ......
  • 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小
    比赛传送门:https://ac.nowcoder.com/acm/contest/53366难度适中。......
  • 颜色分类(数组、双指针)、排列序列(递归、数学)、合并区间(数组、排序)
    颜色分类(数组、双指针)给定一个包含红色、白色和蓝色,一共n__个元素的数组,**原地(https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)**对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数0、1和2分别表示红色、......
  • 区间合并 acwing803
    linkcode#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){ intn; intans=1,tpr=0; vector<pair<int,int>>v; intl,r; cin>>n; for(inti=1;i<=n;i++){ cin>>l>>r;......