来自 [傻 逼] 的全部文章

证明伸展树与动态树的时间复杂度

Splay时间复杂度证明 定理0 若x=y+z+1,那么$2\lg(x)-\lg(y)-\lg(z)\geq 2$ 证明. $2\lg(x)-\lg(y)-\lg(z)$ $=\lg((y+z+1)^2)-\lg(y)-\lg(z)$ $=\lg(\frac{(y+z+1)^2}{yz})$ $=\lg(\frac{2yz}{yz}+\frac{y^2+z^2+1+2y+2z}{yz})$ $\geq \lg(2+\frac{y}{z}+\frac{z}{y})$ $\geq \lg(2+2)$ $=2$ 定理1 在一棵n个节点的Splay中,对一个节点进行splay操作的时间复杂度为均摊复杂度为$O(\log n)$ 证明. 设size(x)表示节点x的子树大小。势能分析,设节点的势能$r(x)=\lg(size(x))$。 对于Zig-Zig或Zag-Zag的情况,势能的增量为 $r'(x)+r ......

浅谈快速傅里叶变换

本人太菜了,不是很懂这个东西,只是有点懂了快速傅里叶变换的一种方法,本文没有代码,只是证明了这种快速傅里叶变换的方法是正确的。 本文大量使用复数,i表示$\sqrt{-1}$。 多项式乘法 快速傅里叶变换用于快速解决多项式乘法的问题。即 设$A(x)=\displaystyle\sum_{j=0}^{n-1}a_jx^j$ $B(x)=\displaystyle\sum_{j=0}^{m-1}b_jx^j$ 令$C(x)=A(x)\times B(x)$ 则C(x)可表示为: $\displaystyle\sum_{j=0}^{n+m-2}c_jx^j$ 我们要解决的问题是已知a数组和b数组,求c数组。 举个例子:有多项式$A(x)=6x^3+7x^2-10x+9,B(x)=-2x^3+4x-5 ......

luoOJ1898 运动会(Race)题解

[题目传送门][1] 我看到题一脸懵逼,感觉一点思路都没有,然后想了6个小时,搞出来了一个很复杂的一堆前缀和的做法,然后错了。最后我发现其实不需要这么复杂,这题其实是一道水题,我们可以进行一些简单的分析来A了它。 由于每天各个人的分数是异或产生的,很容易想到搞一棵字典树。我又发现对于每一个人,它既要取模又要异或,肯定不会一起来算,因此可以把每一个人的得分分开来考虑。 然后我发现,在字典树中对于每一条通向某人A得分的路径上每一层的另外一棵子树中的人总是一起出现在A排名的前面或者后面,而且前 ......

傻逼的世界题目+题解

一道我自己出的水题,题目描述: 要求支持两种操作:对一个三维区间上的数都加上一个数,或者询问一个三维区间上所有数的和,三维区间的三个坐标都是整数且范围在[1,100],询问10000个。 写个三维树状数组就AC了,是不是很简单。数据: sbworld 标程: var c1,c2,c3,c4,c5,c6,c7,c8:array[1..105,1..105,1..105]of int64; num,x1,y1,z1,x2,y2,z2,n,m,p:longint; v,s1,s2:int64; function lowbit(x:longint):longint; begin exit(x and(-x)); end; procedure add(x,y,z:longint;v:i ......

HNOI2008GT考试题解

我们先简化一下问题,比如我们把字符集变成3,可以先来看下长度为3,字符串为10的答案。我们可以想到构一棵决策树,叶节点就是所有的方案,如果一个树上一个节点到根的路径上构成的字符串中有一个子串匹配就把这个点涂黑。如图是这个例子的决策树: 我们用一个补集思想,考虑对于每一个子树中叶节点被染黑的个数,我们发现其只跟前面至多有多少个字符连成的字符串是原串前缀以及树的高度有关,因此我们可以定义动态规划的状态f[i][j]表示高度为i,前面至多有j个字符连成的字符串是原串前缀的子树中被染黑的叶节点的个数。然后我们 ......

BZOJ3670(NOI2014)动物园题解

题目传送门 一道水题,据说有O(n)做法,我竟然没想到也没看懂。我的做法是KMP后用next数组搞棵树,然后在树上找一个节点前面最后一个符合条件的节点,一种方法是发现这玩意有单调性,然后用一个point数组记录下其父亲的决策点,再拿个ST表倍增或者Tarjan+二分,也可以利用轻重链搞一搞就可以了。这里用了轻重链。这种方法我只能证明有O(n^2lgn)的上界,但平均效率很高。 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ......

浅谈平行四边形优化(包含正确性证明)

1.概述 平行四边形优化是一个神奇的东西,可以将时间复杂度为$\Theta(n^3)$的常规区间动态规划问题优化成$O(n^2)$。我们先抛出一个常规的区间DP转移方程: $$m(i,j) =\begin{cases} \displaystyle\min_{i<k\le j}{m(i,k-1)+m(k,j)+w(i,j)} &\text{if } i<j \ 0 &\text{if } i=j \ \infty &\text{if } i>j \end{cases}$$ 如果要可以进行平行四边形优化,该式还要满足:对于所有的$i\le i'<j \le j’$,有: $w(i’,j’)\le w(i,j’)$ (1.1) $w(i,j)+w(i’,j ......

浅谈C++指针

1.指针基础 1.引用 C++有一个东西叫引用,引用相当于给对象(如:变量)起了另一个名字,引用必须用对象初始化,一旦初始化,引用就会和初始化其的对象绑定在一起,就是说引用的值就是被引用的对象的值,引用的值被修改时被引用的对象也会被修改,但不能定义引用的引用,因为引用不是对象,引用定义方式: 类型  &引用名1=对象名1 比如: int i=0; int &amp;x=i,y=i,z=i; 123 int i=0;int &amp;x=i,y=i,z=i;  ......

关于并查集单用按秩合并的分析

1.按秩合并的操作 相信大家都知道并查集(不相交集合森林),由于路径压缩优化后时间复杂度分析极难,不易理解,本文来讨论下一种易于分析的优化方式:按秩合并。按秩合并的时间复杂度是O(lgn)的,常数很小,虽然不是特别优秀,但在许多情况下也够用了。 按秩合并的方式就是,对于每一个结点x记录下一个秩(x.rank),表示结点x的高度。每次链接的时候将rank值小的结点的父亲指向rank值大的结点,如果两者秩一样,就随便链哪一个。伪代码: link(x,y) if x.rank&gt;y.rank y.parent ......

浅析C++类

                              浅析C++类 1.类成员 1.从struct到class 大家应该都知道C++中的struct吧,其只是一个C++类的特殊形式。 struct A{ //内容 }; 123 struct A{ //内容 }; 类用class表示,上述代码就相当于: class A{ public: //内容 }; 1234 class A{ public: //内容 }; 至于public是什么意思会 ......