随笔分类 - 数据结构
1
摘要:VJ的链接:https://cn.vjudge.net/problem/Gym 101908L 题目大意: 一棵个点的树上,查询 ~ , ~ 两段路径公共的点的个数。 解题思路: 读完题就感觉是树链剖分的裸题呀... 树链剖分可以在的时间内维护树上任意
阅读全文
摘要:题目链接:https://nanti.jisuanke.com/t/31714 题意 :一棵树,n个点,初值均为0,有四个操作: 1 u v x 把u v路径上所有点乘以x 2 u v x 把u v路径上所有点加上x 3 u v 把u v路径上所有点的...
阅读全文
摘要:Splay,中文名伸展树,是由tarjan大神发明的… orz 本质上就是BST加上splay操作——把结点x旋转到指定结点的下面。 每次查询完都把查到的数旋转到根,就可以让所有查找的时间效率为均摊O(logN) (不知道为啥…大佬说是就是吧orz)因为Sp...
阅读全文
摘要:Treap = Tree + heap,Tree是BST,即同时维护二叉查找树和堆的性质 Treap的定义:int ch[maxn][2], val[maxn], siz[maxn], num[maxn], pri[maxn];//此处优先级用了小根堆int...
阅读全文
摘要:一般线段树做区间修改操作时,先是找到目标区间,然后修改该区间,并打下延迟标记,最后从目标区间自底向上,更新所有包含目标区间的区间的值(即pushup)。当该区间子节点被访问前,pushdown下推标记。 这种维护区间的方式存在一点点弊端。例如用这种方式写一棵...
阅读全文
摘要:最近在学splay,就用这道题来记一下模板。splay是二叉搜索树,满足中序遍历有序的性质;同时,splay操作可以在不改变中序序列的前提下改变树的结构。因此,splay可以十分方便地维护区间信息。#includeusing namespace std;co...
阅读全文
摘要:题意: 有一个长度为n的数组a,初值均为0,有m组修改,由题目给的一个随机函数生成l, r, v,把a在区间 [ l , r ] 中小于v的值修改为v,最终输出 ⨁i=1n" role="presentation" style="positio...
阅读全文
摘要:题目链接: hdu6315 题目大意: 输入一个n,下一行输入一个长度为n的数组b,b是1到n的一种全排列,还有一个长度为n初值全为0的数组a 两种操作: 1) 输入add l r ,将al" role="presentati...
阅读全文
摘要:#includeusing namespace std;const int maxn = 100000+10;int N,M,R,P,w[maxn];struct{ int to,next; }e[maxnsiz[son[u]]) ...
阅读全文
摘要:题意:三种操作,0 e 表示插入一个数字e,1 e 表示删除一个数字e,2 e k 表示查询比e大的第k个数,删除和查询均可能没有目标。思路:建一棵权值线段树,维护每个数字区间中数字的数量。 查询时,先查出1到e的数字数量n,然后查询第k+n大。#inclu...
阅读全文
摘要:题意: 输入N个数字,查询区间[L,R]中有多少个不同的数字(第i个数字为a[i])思路:要维护的是不同的数字的数量,所以每个数只记最后出现的那一次。对N个位置每个位置建一棵线段树,线段树维护的是插入a[i]后树上各区间数字的数量。如果a[i]这个数字在前面...
阅读全文
摘要:老板与员工之间是树形关系。每次给一个员工下达任务就是修改这个员工为根的子树。 用dfs序把每一棵子树转化成一个区间,用线段树维护,T就是区间更新维护lazy,C就是单点查询。#include using namespace std;const int max...
阅读全文
摘要:离散化: 对数组排完序后用unique去重,unique返回的是去重后的数组的末地址,减去第一个元素的地址就能得到去重后的数组大小,用lower_bound查找原数字在排序去重后的序列中的位序,用位序代替数字完成离散化。#include#includ...
阅读全文
摘要:#include#include#includeusing namespace std;#define lson l,m,rt>1); ms[rt>1; } lazy[rt] = -1; }}void ...
阅读全文
摘要:今天课上学的堆排序。#includeusing namespace std;void HeapAdjust(int a[],int i,int len){ if(i>len/2)//大于len/2的是叶子结点,不用调整 return ;...
阅读全文
摘要:#define lson l,m,rt>1; build(lson); build(rson); pushup(rt);}void pushdown(int l,int r,int rt){ if(lazy[rt]) { ...
阅读全文
摘要:思路:先序序列的每个元素代表一个根节点,这个元素在中序序列中左边的部分就是它的左子树,右边部分就是它的右子树代码如下(求树深度的部分是多余的):#includeusing namespace std;int N;string xian,zhong;struc...
阅读全文
摘要:Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent ones. Your task ...
阅读全文
摘要:struct Node{ int cnt; Node *next[26]; bool exist; Node() { cnt = 0; memset(next,0,sizeof(next)); ...
阅读全文
摘要:#include#include#includeusing namespace std;typedef long long ll;ll t[100005>1; build(l,m,rt=L&&r>1; pushdown(rt,m-l+1,r-m)...
阅读全文
1