【LG3835】可持久化平衡树

【LG3835】可持久化平衡树

题面

洛谷

解法一

参考文章
rope大法好
\(rope\)基本操作:

#include<ext/rope>
using namespace __gnu_cxx;//rope的命名空间
rope<type> R;
R.push_back(a) //往后插入
R.insert(pos,a)//在pos位置插入a,pos是一个迭代器。
R.erase(pos,n)//在pos位置删除n个元素。
R.replace(pos,x)//从pos开始替换成x
R.substr(pos,x)//从pos开始提取x个。
//多数时候定义rope用指针(方便可持久化) 所以上面的点多数时候要换成->

再配合二分即可实现各种操作
如何进行复制:

rope<type>* R[1000];
R[i] = new rope<type>(*R[v]);

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <ext/rope>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_cxx; 
inline int gi() {
    register int data = 0, w = 1;
    register char ch = 0;
    while (ch != '-' && (ch > '9' || ch < '0')) ch = getchar();
    if (ch == '-') w = -1 , ch = getchar();
    while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar();
    return w * data;
} 
#define MAX_N 500005 
rope<int> *rop[MAX_N]; 
int N; 
int main () {  
    N = gi(); 
    rop[0] = new rope<int>(); 
    for (int i = 1; i <= N; i++) { 
        int v = gi(), opt = gi(), x = gi(); 
        rop[i] = new rope<int>(*rop[v]); 
        if (opt == 1) rop[i]->insert(lower_bound(rop[i]->begin(), rop[i]->end(), x) - rop[i]->begin(), x); 
        if (opt == 2) { 
            auto ite = lower_bound(rop[i]->begin(), rop[i]->end(), x); 
            if (ite != rop[i]->end() && *ite == x) rop[i]->erase(ite - rop[i]->begin(), 1); 
        } 
        if (opt == 3) 
            printf("%d\n", (int)(lower_bound(rop[i]->begin(), rop[i]->end(), x) - rop[i]->begin()) + 1); 
        if (opt == 4) printf("%d\n", *(rop[i]->begin() + x - 1)); 
        if (opt == 5) { 
            auto ite = lower_bound(rop[i]->begin(), rop[i]->end(), x); 
            if (ite == rop[i]->begin() - 1) puts("-2147483647"); 
            else --ite, printf("%d\n", *ite); 
        } 
        if (opt == 6) { 
            auto ite = upper_bound(rop[i]->begin(), rop[i]->end(), x); 
            if (ite == rop[i]->end()) puts("2147483647"); 
            printf("%d\n", *ite); 
        } 
    } 
    return 0; 
} 

解法二

咕咕咕,以后再更

猜你喜欢

转载自www.cnblogs.com/heyujun/p/10101269.html