Al árbol presidente de la luna + marca permanente

Portal

Descripción del Título

Darle una serie de secuencias, cada vez hay cuatro operaciones en él, 1. Todos los números entre ly r + d, y la marca de tiempo +1. 2. Consultar la suma de todos los números de la r bajo la marca de tiempo actual. 3 ... Consultar la suma de todos los números de la r bajo la marca de tiempo d. 4. Devuelva la marca de tiempo a t.

análisis

El árbol del presidente ha marcado un título permanente de la junta, aprendamos hoy

En primer lugar, si no hay una versión histórica de esta pregunta, podemos usar el árbol de segmento de línea para resolver este problema fácilmente, pero con la adición del
árbol de segmento de línea persistente , usa la marca diferida al procesar la modificación del intervalo. La operación de empujar mueve la marca capa por capa. El método de procesamiento del árbol del presidente es similar a la marca perezosa, pero si usamos pushdown para pasar la marca, la ocupación de memoria de la
marca permanente es marcar el intervalo cuando el intervalo de modificación contiene el intervalo actual. Pero no lo transmita. Al final de la consulta, agregue el valor de contribución de cada etiqueta a la respuesta.

Código

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstring>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#pragma GCC option("arch=native","tune=native","no-zero-upper")
#pragma GCC target("avx2")
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int N = 1e5 + 10;
int n,m,idx;
int now;
int root[N];
ll a[N];

struct Node{
    
    
    int l,r;
    ll sum,add;
}tr[N * 30];

int build(int l,int r){
    
    
    int p = ++idx;
    if(l == r){
    
    
        tr[p].sum = a[l];
        return p;
    }
    int mid = l + r >> 1;
    tr[p].l = build(l,mid);
    tr[p].r = build(mid + 1,r);
    tr[p].sum = tr[tr[p].l].sum + tr[tr[p].r].sum;
    return p;
}

void up(int l,int r,int pre,int &pp,int L,int R,ll val){
    
    
    if(l > R || r < L) return ;
    tr[++idx] = tr[pre];
    pp = idx;
    if(l >= L && r <= R){
    
    
        tr[pp].add += val;
        tr[pp].sum += val * (r - l + 1);
    }
    else{
    
    
        int mid = l + r >> 1;
        tr[pp].sum += val * max(0,min(r,R) - max(l,L) + 1);
        up(l,mid,tr[pre].l,tr[pp].l,L,R,val);
        up(mid + 1,r,tr[pre].r,tr[pp].r,L,R,val);
    }
}

ll query(int l,int r,int x,int L,int R,ll sum){
    
    
    if(l > R || r < L) return 0;
    if(l >= L && r <= R) return tr[x].sum + sum * (r - l + 1);
    else{
    
    
        ll mid = l + r >> 1;
        return query(l,mid,tr[x].l,L,R,sum + tr[x].add) + query(mid + 1,r,tr[x].r,L,R,sum + tr[x].add);
    }
}

void init(){
    
    
    idx = 0;
    now = 0;
}

int main(){
    
    
    while(~scanf("%d%d",&n,&m)){
    
    
        init();
        for(int i = 1;i <= n;i++) scanf("%lld",&a[i]);
        root[0] = build(1,n);
        while(m--){
    
    
            char op;
            ll l,r,d;
            scanf(" %c %lld",&op,&l);
            if(op == 'C'){
    
    
                scanf("%lld%lld",&r,&d);
                now++;
                up(1,n,root[now - 1],root[now],l,r,d);
            }
            else if(op == 'Q'){
    
    
                scanf("%lld",&r);
                printf("%lld\n",query(1,n,root[now],l,r,0));
            }
            else if(op == 'H'){
    
    
                scanf("%lld%lld",&r,&d);
                printf("%lld\n",query(1,n,root[d],l,r,0));
            }
            else now = l;
        }
    }
}

/**
*  ┏┓   ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃       ┃
* ┃   ━   ┃ ++ + + +
*  ████━████+
*  ◥██◤ ◥██◤ +
* ┃   ┻   ┃
* ┃       ┃ + +
* ┗━┓   ┏━┛
*   ┃   ┃ + + + +Code is far away from  
*   ┃   ┃ + bug with the animal protecting
*   ┃    ┗━━━┓ 神兽保佑,代码无bug 
*   ┃        ┣┓
*    ┃        ┏┛
*     ┗┓┓┏━┳┓┏┛ + + + +
*    ┃┫┫ ┃┫┫
*    ┗┻┛ ┗┻┛+ + + +
*/

Supongo que te gusta

Origin blog.csdn.net/tlyzxc/article/details/112268579
Recomendado
Clasificación