随笔分类 - 线段树
数据结构
摘要:四种类型的第k小数 1、静态整体Kth 很简单...sort一遍就好了。 时间复杂度O(nlogn) 空间复杂度O(n) 2、动态整体Kth 2.1离散化后开一棵权值线段树,每个位置的值表示这个位置对应的那个数(离散化后的)有多少个,向上维护和; 查询时先查询左子树和sum,比较k和sum的大小:若
阅读全文
摘要:对权值作为维护对象而开的线段树,即每个点存的是区间内对应数字的某种值(出现的次数)。 权值线段树用于维护一个数在一个序列中出现的次数 比如数值1,1,2,2,2,3,4,5,6,7,8 初始每个节点为0 插入1 插入2 插入3 插入4 插入5 插入6 插入7 插入8 模板普通平衡树p3369题目描述
阅读全文
摘要:简单来说就是,你要用到一个点才开那个点,不用的点不开,可以大幅节省空间。这样空间复杂度可以大致降到O(nlogn)。是不是很棒。接下来是实现:一开始,你只有一个根节点。通过update函数往树里面插点,开两个数组记录每个节点的左右儿子编号。递归进入左右儿子,如果要用新点,就开新点。上代码(以区间和为
阅读全文
摘要:重链剖分 #include<bits/stdc++.h> using namespace std; const int maxn=3e4+10; struct node{ int to; int nxt; }E[maxn<<1]; int n,h[maxn],etot,tot,top[maxn],s
阅读全文
摘要:dfs序前置知识:线段树,树状数组,LCA,树的存储,树的基础问题类型1.点修改,子树查询2.子树修改,点查询3.子树修改,子树查询4.链修改,点查询5.点修改,链查询6.链修改,子树查询7.子树修改,链查询(1-3)易,(4-5)中,(6-7)难
阅读全文
摘要:P1177 【模板】快速排序 //动态开点线段树,指针版 #include<bits/stdc++.h> using namespace std; const int maxn=100010; typedef struct node{ int cnt; node* ls; node* rs; }no
阅读全文
摘要:#include<bits/stdc++.h> using namespace std; const int N=10000010; int T[N<<3]; void update(int p,int v,int rt,int l,int r) { T[rt]+=v; if (l==r) retu
阅读全文
摘要:P1531 I Hate It区间最大值,区间查询最大值,单点更新 //P1531 I Hate It #include<cstdio> #include<algorithm> #include<iostream> using namespace std; #define lson l,m,rt<<
阅读全文
摘要:P1204 [USACO1.2]挤牛奶Milking Cows从暴力思想出发,建立一个bool数组用来标记哪些时间有挤牛奶,哪些时间空闲,然后从有挤牛奶的时间开始统计每一个段挤牛奶时间和空闲时间,并求最长挤牛奶时间和最长空闲时间,这样做时间复杂度为O(n*s),s为挤牛奶的时间长度,会TLE。如果优
阅读全文
摘要:P3374 【模板】树状数组 1题解:线段树的单点更新,区间查询,注意线段树的结点个数是原数组的4倍 #include<iostream> #include<cstdio> using namespace std; long long s[2000100],a[501000],n,m,dx,dy;
阅读全文
摘要:普通线段树问题引入给定一个序列有n(n<=100000)个元素,有如下两个基本操作查询:给定区间[l..r],求这个区间所有元素的和修改:修改某个元素的值。任务:输出每个查询的值。任务数量m(m<=100000),只有上述两种操作。朴素算法一对于查询任务可以使用循环完成,时间复杂度O(n)。对于修改
阅读全文