首页 > 其他分享 >主席树模板

主席树模板

时间:2024-08-07 19:38:17浏览次数:7  
标签:lc int sum tr tot 模板 主席 build

template<class Node>
struct PersidentSegmentTree {
#define lc(u) tr[u].l
#define rc(u) tr[u].r
#define sum(u) tr[u].s
    const int n;
    int tot = 0;
    vector<Node> tr;
    vector<int> root;

    PersidentSegmentTree(): n(0) {}

    PersidentSegmentTree(int n_): n(n_) {
        int N = (n << 7) + 10;
        tr.reserve(N); root.reserve(N);
        tr.resize(N); root.resize(N);

        function<void(int&, int, int)> build = [&](int& u, int l, int r) {
            u = ++ tot;
            sum(u) = 0;
            if (l == r) {javascript:void(0);
                return ;
            }
            int m = (l + r) >> 1;
            build(lc(u), l, m);
            build(rc(u), m + 1, r);
        };
        build(root[0], 1, n);
    }

    void insert(int u, int& v, int l, int r, int pos) {
        v = ++ tot;
        tr[v] = tr[u], sum(v) = sum(u) + 1;
        if (l == r)
            return;
        int m = l + r >> 1;
        if (pos <= m)
            insert(lc(u), lc(v), l, m, pos);
        else
            insert(rc(u), rc(v), m + 1, r, pos);
    }

    int query(int u, int v, int l, int r, int k) {
        if (l == r)
            return l;

        int m = l + r >> 1, s = sum(lc(v)) - sum(lc(u));
        if (k <= s)
            return query(lc(u), lc(v), l, m, k);
        else
            return query(rc(u), rc(v), m + 1, r, k - s);
    }
};

struct Node {
    int l, r, s;
};

标签:lc,int,sum,tr,tot,模板,主席,build
From: https://www.cnblogs.com/Kescholar/p/18347769

相关文章

  • P10814 【模板】离线二维数点
    原题链接题解对于一段区间\([l,r]\)我们可以在\(r\)的位置查询一次,然后利用差分的思想跑到l-1再查一次虽然这样不行,但是可以先在\(l-1\)的位置查询一次,然后再在\(r\)的位置查询一次,然后顺序遍历,每次遍历就把对应位置上的数激活,可以用树状数组code#include<bits/stdc+......
  • 模板
    [置顶]缺省源#include<bits/stdc++.h>#defineDebugputs("Oops!")//#defineintlonglongusingnamespacestd;constintN=1e5+5,M=5e5+5;inlineintread(){ intx=0,f=1;charc=getchar(); while(!isdigit(c)){if(c=='-......
  • kmp算法模板
    模板//pi代表前缀函数 //pi[i]:s[0~i]的最长匹配真前后缀长度 vecotr<int>pi(str.size()); //求前缀函数 for(inti=1;i<str.size();i++){ intlen=pi[i-1];//前一个值的pilen是我们想要找到的一个长度值 while(len!=0&&str[i]!=str[len]){//不匹配时,......
  • 织梦DEDECMS列表页首页怎么跟其它页使用不同模板
    有些时候我们需要使列表页的首页跟第二页以及后面的页面的样式不同,修改dede:list标签又很难达到理想的效果,那么织梦猫就为大家介绍一个最简单的办法,就是为首页单独指定一个模板页,其余页面则调用另一个模板页。修改的办法如下:打开include目录下的arc.listview.class.php文件,找到D......
  • 洛谷P1226 【模板】快速幂
    1.快速幂模板前置知识一个数字n,它的二进制位数一定是log2n向下取整+1;快速幂模板代码这段代码实现了快速幂算法(Exponentiationbysquaring),用来计算(an)的值,其中(a)和(n)都是整数。intquickpow(inta,intn){intres=1;//初始化结果为1,因为任何数的......
  • 【CDQ分治】【模板】三维偏序(陌上花开)
    P3810【模板】三维偏序(陌上花开)-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;template<typenameT>structBIT{#ifndeflowbit#definelowbit(x)(x&(-x));#endifintn;vector<T&......
  • 织梦dedecms怎么更换模板
    更换Dedecms模板是一个相对简单的过程,本指南将详细介绍如何操作。步骤下载模板从Dedecms官方网站或其他可信来源下载所需的模板。上传模板解压缩下载的模板文件,并将所有文件上传到Dedecms安装目录中的"templets"文件夹。管理模板登录Dedecms后台,进入......
  • CPP 基于模板的类型相同判断[CPP template-8]
    今天的代码是今年早些时候写的,std库中也有类似的方法。这里我们把思路理一下,写一个自己的类型相同判断模板♪(´▽`)在python中//Typecomparison//基本操作写于24/5/2//功能是通过模板元编程进行两个变量类型的对比//(没错,python中易如反掌的事情,在CPP中需要不一般......
  • C++(模板)
    目录1.函数模板(FunctionTemplates)1.1基本语法:1.2使用示例:2.类模板(ClassTemplates)2.1基本语法:2.2使用示例:3.模板的特性在C++中,模板是泛型编程的重要工具,用于编写通用和可重用的代码。模板主要有两种类型:函数模板和类模板。1.函数模板(FunctionTemplates)函数模板允......
  • 仿柠檬观看PC+WAP模板影视电影模板
    ###苹果CMSv10仿柠檬观看PC+WAP模板影视电影模板在数字化时代,影视内容的消费模式正在经历一场**。随着互联网技术的飞速发展,网络影视平台如雨后春笋般涌现,为用户提供了丰富多样的观影选择。苹果CMSv10作为一款功能强大的内容管理系统,为影视网站的建设提供了强有力的技术支......