听说灌水区大佬多,线段树求调
  • 板块灌水区
  • 楼主Yanran_10086
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/14 20:07
  • 上次更新2023/11/2 13:48:40
查看原帖
听说灌水区大佬多,线段树求调
704651
Yanran_10086楼主2023/10/14 20:07
#include <iostream>      // 标准输入/输出流头文件       // 链表头文件
#include <locale>        // 本地化库头文件
#include <map>           // 映射头文件
#include <memory>        // 动态内存管理头文件
#include <new>           // 全局操作符 new/delete 头文件
#include <numeric>       // 数值库头文件
#include <ostream>
#include <queue>
#include <streambuf>
#include <string>        // 字符串库头文件
#include <valarray>      // 数值数组头文件
#include <variant>       // 变体类型库头文件
#include <vector>        // 向量头文件
#include <math.h>        // 数学库头文件
#include <stdint.h>      // 整型头文件
#include <stdio.h>       // 输入输出库头文件
using namespace std;
const int maxx=1e3;
int a[maxx];
int tree[4*maxx],lazy[4*maxx];
void push_up(int node){
    tree[node]=tree[2*node]+tree[2*node+1];
}
void push_down(int node,int start,int end){
    if(lazy[node]){
        int mid=(end-start)/2;
        lazy[2*node]+=lazy[node];
        lazy[2*node+1]+=lazy[node];
        tree[2*node]+=tree[node]*(mid-start+1);
        tree[2*node+1]+=tree[node]*(end-mid);
        lazy[node]=0;
    }
}
void build(int node,int start,int end){
    if(start==end){
        tree[node]=a[start];
        return ;
    }
    int mid=(end-start)/2;
    build(2*node,start,mid);
    build(2*node+1,mid+1,end);
    tree[node]=tree[2*node]+tree[2*node+1];
}
int findd(int node,int start,int end,int l,int r){
    if(l<=start && end<=r){
        return tree[node];
    }
    int mid=(end-start)/2;
    int ans_left=findd(2*node,start,mid,l,r);
    int ans_right=findd(2*node+1,mid+1,end,l,r);
    return ans_left+ans_right;
}
void update(int node,int start,int end,int l,int r,int val){
    if(start>=l && end<=r){
        lazy[node]+=val;
        tree[node]+=val*(end-start+1);
        return ;
    }
    push_down(node,start,end);
    int mid=(end-start)/2;
    if(l<=mid){
        update(2*node,start,mid,l,r,val);
    }
    if(r>mid){
        update(2*node+1,mid+1,end,l,r,val);
    }
    push_up(node);
}
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    for(int i=0;i<m;i++){
        short ord;
        cin>>ord;
        if(ord==1){
            int x,y,val;
            cin>>x>>y>>val;
            update (1,1,n,x,y,val);
        }
        else{
            int x,y;
            cin>>x>>y;
            int ans=findd(1,1,n,x,y);
            cout<<ans<<endl;
        }
    }
}
2023/10/14 20:07
加载中...