Untitled

 avatar
unknown
plain_text
2 years ago
2.7 kB
6
Indexable
#include<bits/stdc++.h>
using namespace std;

struct Segment_tree{
    int x, la; //node值, lazy
    pair<int, int> seg; //segment
}tree[800000];

void create_tree(int L, int R, int node){ //範圍
    tree[node].la = 0;
    tree[node].seg.first = L;
    tree[node].seg.second = R;
    tree[node].x = 0;
    int mid = (L + R) / 2;
    if(L != R){
        create_tree(L, mid, node * 2);
        create_tree(mid + 1, R, node * 2 + 1);
    }
}

int add_sub_segment(int l, int r, int value, int node){//左值, 右值, 加減的value, 目前的node
    //node區間完全在想要的區間以內,不需再往下做
    if(tree[node].seg.first >= l && tree[node].seg.second <= r){
        tree[node].x = tree[node].x + value;
        tree[node].la = tree[node].la + value;
        return tree[node].x;
    }
    //把lazy值往下做
    tree[node * 2].x += tree[node].la;
    tree[node * 2 + 1].x += tree[node].la;
    tree[node * 2].la += tree[node].la;
    tree[node * 2 + 1].la += tree[node].la;
    tree[node].la = 0;
    int mid = (tree[node].seg.first + tree[node].seg.second) / 2;
    //左右子樹都做
    if(l <= mid && r > mid){
        tree[node].x = min(add_sub_segment(l, mid, value, node * 2), add_sub_segment(mid + 1, r, value, node * 2 + 1));
    }
    //右子樹
    if(l > mid && r >= l){
        tree[node].x = min(tree[node * 2].x ,add_sub_segment(l, r, value, node * 2 + 1));
    }
    //左子樹
    if(l <= r && r <= mid){
        tree[node].x = min(add_sub_segment(l, r, value, node * 2), tree[node * 2 + 1].x);
    }
    return tree[node].x;
}

int search_segment_tree(int l, int r, int node, int save){ // 查找的左值, 查找的右值, 目前的node, 有沒有安全的位置
    if(tree[node].seg.first >= l && tree[node].seg.second <= r){
        if(tree[node].x <= 0){
            save++;
            //cout << node << " node\n";
        }
        return save;
    }
    tree[node * 2].x += tree[node].la;
    tree[node * 2 + 1].x += tree[node].la;
    tree[node * 2].la += tree[node].la;
    tree[node * 2 + 1].la += tree[node].la;
    tree[node].la = 0;
    int mid = (tree[node].seg.first + tree[node].seg.second) / 2;
    if(l <= mid && r > mid){
        save += search_segment_tree(l, mid, node * 2, save);
        save += search_segment_tree(mid + 1, r, node * 2 + 1, save);
        return save;
    }
    if(l > mid && r >= l){
        save += search_segment_tree(l, r, node * 2 + 1, save);
        return save;
    }
    if(l <= r && r <= mid){
        save += search_segment_tree(l, r, node * 2, save);
        return save;
    }
}

int main(){
    
}
Editor is loading...