
数据结构----tree
凉秋girl
保持学习应该是最难的一件事吧?
展开
-
HDU1754 <线段树创建,查找,更新>
the reason of failure:1、又一次被cin的速度坑了!!!注意大数据要用scanf的输入方法啊。 learning:1、线段树是用来干嘛的,是可以找区间最大最小值或者和之类的值的。 thinking:每次这个线段的max1取max(max1,weight)。也就是判断改变的这个值,是否大于这个线段的max1,如果大就更改。 代码: #include #include原创 2017-01-01 20:24:46 · 222 阅读 · 0 评论 -
HDU 1698 <线段树+更新区间>
the reason of failure:1、多组数据,所以每次输出的值sum需要赋值0,然后才把金属棒的值相加后输出。 2、!!!看好输出的样例,不简简单单只是输出个答案,而是输出一串。 thinking:用一个值来表示每个线段的值,当为各种值的时候其为0,当这个线段只为一种颜色的时候,其不为0。 对于更新时,当这个线段非0,那么把其两个son结点的k变为这个结点的k,然后把这个结点的k原创 2017-01-02 11:31:53 · 233 阅读 · 0 评论 -
CDoj 1324<分块>
看了电子科大的分块算法视频学会的,看视频来学算法感觉特别棒!! 当线段树或树状数组对区间问题还是很难解决时,可以考虑分块。 分块的思想是把范围为n的数列,分为num块,每块长度为sqrt(n),长度为num(n%sqrt(n)==0时)/num+1块。 block为块的长度,然后定义数组L[i],R[i],表示块i的左边界和右边界。belong[i]意思是第i个数据属于哪一个块。 这样就b原创 2017-05-11 10:55:41 · 267 阅读 · 0 评论 -
splay的模版
#include #include #include #include using namespace std; #define MAXN 100010 struct Node{ int key, sz, cnt; //cnt表示结点值为key的结点的数量 Node *ch[2], *pnt;//左右儿子和父亲 Node(){} //给Node函数赋值。 N原创 2017-08-11 16:17:07 · 284 阅读 · 0 评论 -
LCA模版,用倍增的思想
poj 2586 模版 #include #include #include #include using namespace std; //#pragma comment(linker, "/STACK:102400000,102400000") //不需要申请系统栈 const int N = 40010; const int M = 25; int dp[2*N][M]; //原创 2017-08-06 19:18:37 · 211 阅读 · 0 评论 -
D、Vitya and Strange Lesson(字典树模版)
很多二进制关于异或求最值的问题,都可以转换为字典树来求,然后在字典树上往最左边或者最右边跑,使得结果达到最值。 这题就每次异或改变的值可以当作改变每次异或的查询使得字典树不变。 然后用num(不计算重复)来计算每个分支里面的数的个数,如果数满了就进入到另外一个分支(使得绕过所有最小值的最小值) 然后当res=0的时候,也就是满足这个分支里没有任何数,那么就不再加任何数了 #include原创 2017-08-30 23:51:31 · 597 阅读 · 0 评论