10 2012 档案
poj 2155 Matrix(二维树状数组)
摘要:http://poj.org/problem?id=2155 二维树状数组【区间更新,单点查询】,一道简单题!View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 const int maxn = 1005; 8 struct BIT2D { 9 int size;10 bool val[maxn][maxn];11 12 void init() {13 memset(val, false, si...
阅读全文
Ural 1650 Billionaires(线段树)
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1650 用线段树统计的模拟题,开始的时候数组开小了,以为城市只有50000个,所以wa了两次,后来开大了就过了!~ ^_^这题用STL解决代码量比较小,据说可以用set来充当我的线段树。代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <set> 6 #include
阅读全文
ural 1067 && poj 1760 Disk Tree(字典树+模拟)
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1067 这题是模拟一个目录,我用到字典树来做这题。 这题我是用大量stl来减少代码量,不过我对stl的功能并不是完全的熟悉,所以用起来有点别扭,代码时间也大约用了半个多小时,不过最后稳稳的1y了!~参考代码:View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6
阅读全文
ural 1651 Shortest Subchain
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1651 这是今天训练的题,最近的训练都没有暑假的时候这么好的状态。整场训练,实际上有好几题可以做的,可是一开始就遇见这题,然后开始的时候做的方法不对,所以一直卡在这题,直到最后一个小时才出那两道水题。开始的时候以为这题就一个简单的bfs,直到打完比赛才明白原来这题是最短路。图论的题我都不太擅长,所以今天就这样卡死了。。。囧! 这题构图用的方法是先建好原路径的边,每个位置是一个点,然后标号相同的临近两个位置连一条长度是0的边,然后一个spfa搜索到结尾,最后回溯一下就可以得到目标序列了。代码如下:
阅读全文
hdu 4305 Lightning
摘要:http://acm.hdu.edu.cn/statistic.php?pid=4305&from=126&lang=&order_type=0 生成树计数加上极角排序,开始的时候忘记了计算过程中,数值会变成负数,所以wa了一次。生成树计数的矩阵运算必须注意,最后答案应该将它调整为整数。 题意是有n(n<=300)个人,如果某个人被电了,在他附近r范围内的人都会被电,算出被电的人形成的图案的种类数。两个能传递的人之间的直线位置不能有第三个人。1800+ms的代码。。。囧:View Code 1 #include <cstdio> 2 #include
阅读全文
spoj 104 Highways(生成树计数)
摘要:http://www.spoj.pl/problems/HIGH/ 题目写着答案不超过long long,应该是中间过程爆long long了,所以用整型做的时候在辗转相除的过程超时了,后来改成double就过了!代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 6 using namespace std; 7 8 //typedef long long ll; 9 typedef double l
阅读全文
Ural 1627 Join(生成树计数)
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1627 生成树计数的题,直接用Matrix-Tree定理就可以解决问题了。代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 const int maxSize = 100; 8 const int initMod = 1e9; 9 typedef long long ll; 10 int curS
阅读全文
LightOJ 1277 Looking for a Subsequence
摘要:http://www.lightoj.com/volume_problemstat.php?problem=1277 LightOJ搞得挺漂亮的,第一次到那里交题,挺喜欢的。 线段树统计题,题意是:给出一行数,找到所要求的长度的单调上升子序列,并输出该序列。 这题我是先从后往前,求出到达某个位置的时候,最长可以构建出多长的单调上升子序列。这是一个dp问题,不过用dp方法复杂度是O(n^2)会超时,所以我用线段树来降低查找的复杂度。题目比较简单,不过数据范围较大,所以要用hash来离散化处理。最后回溯一下就可以搜索出目标序列了!代码如下:View Code 1 #include <cs..
阅读全文
poj 2104 K-th Number(可持久化线段树)
摘要:http://poj.org/problem?id=2104 这是我第二次写这题了,原因只前两天看了可持久化数据结构的论文,看到线段树用可持久化的方式来写可以完成这题,于是在我构思好以后就一气呵成的把这题打了出来。一打出来就顺利通过了编译,不过刚开始的时候忘记将新建的结点的两个指针都赋值,所以稍稍debug了一下这个小问题。交上去以后RE了几次,原因是我的hash写烂了。在我改过来以后又变成TLE了,于是我就改成了模拟分配内存。。。。。几经周折,终于AC了! 这个题感觉如果是用可持久化来写,思路比较容易理清,不用像划分树复杂的位置运算,也不用像树套树那样动则200行代码。代码如下:View..
阅读全文
hdu 4031 Attack(BIT)
摘要:acm.hdu.edu.cn/showproblem.php?pid=4031 一道树状数组的题目,当然,用线段树也是可以的。不过线段树的常数比较大,所以不建议在这题用。 题意:有一道1~N的防线。对于每一个防线单位,某个时间t0被攻击过后,t0+1~t0+t-1的时间里的所有攻击都是成功的。在某些攻击过后会有查询,询问某个防线单位到目前为止受到了共多少次攻击。每攻击一次算一次单位时间,查询不算时间。 做法是用全部包含该被询问的防线单位的攻击次数减去被成功防御的攻击次数,因为这样做可以将统计的时间跳跃查找,从而降低复杂度。当然,最坏的情况是每个询问都由头搜索到尾,复杂度O(n^2)。根据...
阅读全文
hdu 4351 Digital root
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4351 这题是一道稍微复杂的区间合并线段树,因为没有query,可以写成RMQ来降低query的复杂度。 题意不难理解,先解释一下所谓的数字的根是指一个数的各位数字和的各位数字和的各位数字和的各位数字和。。。。直到数只剩一位。数字根有一个性质,就是它如果是非0,最后必然是非0的数;如果这个数模9余d,d!=0,d就是数字根,d==0,数字根就是9。知道性质以后,题目给出一列数,要求求出给定的一个区间里所有子序列的和的数字根中最大的5个数字根,不包括重复的。这个题意可以直接由下面的hint看出。 解决这个...
阅读全文
hdu 3221 Brute-force Algorithm
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3221 矩阵快速幂加上x^n取模公式的一道题。 题意是计算函数在题目图片中的暴力程序中被调用了多少次。只要稍微模拟一下就可以知道是求a^f(n)+b^f(n+1) (mod P)是多少,其中f(n)为a[1]=1、a[2]=0且a[i]=a[i-1]+a[i-2]中的a[n]。这题有一条公式可以直接利用,x^n (mod m) = x^(n%phi(m)+phi(m)) (mod m),其中n>m,phi(m)为m的欧拉函数。这种方法的复杂度为O(sqrt(m))。 其实这题也可以用之前一题的cycle
阅读全文
poj 2892 Tunnel Warfare (Splay Tree instead of Segment Tree)
摘要:poj.org/problem?id=2892 poj上的一道数据结构题,这题正解貌似是Segment Tree,不过我用了Splay Tree来写,而且我个人认为,这题用Splay Tree会更好写! 先简单解释一下题意:有n个连续的村庄,有以下几种操作(1)破坏一个村庄(2)问某个村庄与多少个村庄相连(包括它本身)(3)重建之前破坏了的村庄。 这道题用Splay Tree做要用到一个类似DLX(Dancing Links)的操作,就是结点的假删除,用到这个题上可以说是相当的巧妙的。我们在删除结点前把结点Splay到根的位置,然后删除的只是子结点指向父结点(也就是现在要删除的结点)的指...
阅读全文
SGU 455 Sequence analysis
摘要:http://acm.sgu.ru/problem.php?contest=0&problem=455 一道关于cycle detection技术的数论题。我用的是wiki中提到的第二种方法,跑出来的时间大约350ms。 题目说了数的范围是有符号的长整形,开始的时候我考虑到数据可能溢出,于是我就用了模乘法,可是交的时候在第6或第7个test的就TLE了。TLE了以后我就直接删去了模乘法,不过因为开始的时候限制计算的次数的判断的位置放的不对,所以在某些数据上会TLE或者wa。比较幸运的是,我随便测了一组数据就发现问题了。改过来以后就AC了~原始代码:View Code 1 #includ
阅读全文
hdu 3487 Play with Chain (Splay Tree easy)
摘要:acm.hdu.edu.cn/showproblem.php?pid=3487 再来一道Splay Tree的简单题,因为只用到两个基本操作,剪接和反转。虽说是简单题,可是我对细节稍有疏忽,所以我wa了几次。问题出在延迟标记的更新上,可能是半夜打代码的缘故,头脑有点不灵活,从而导致这种不容易debug出问题的错误,以后要多加注意这样的小问题!AC代码:View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 6
阅读全文
hdu 3436 Queue-jumpers(Splay Tree)
摘要:acm.hdu.edu.cn/showproblem.php?pid=3436 中等难度的数据结构题,不过数据范围大,所以要hash操作过的数列。1y~ 题意就像题目一样,模拟一队人,其中有人插队,询问某个时刻,第x个人的编号或编号为x的人的位置。代码如下:View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <algorithm> 4 #include <cstring> 5 #include <set> 6 7 using namespace std; 8 9
阅读全文
Splay Tree (POJ 3580 & UVA 12356 & HDU 1890)
摘要:最近几天熟悉着用Linux,所以做题的量少了下来。这几天新学习了Splay Tree这种数据结构,于是在看懂了Splay操作以后就找了几道题来练手,除了UVA那题是1y顺利通过的,其他两题都出现了各种不同的错误,不过最终还是通过了! POJ 3580是我入手Splay Tree的第一道题,这道题需要的操作包括: 1.区间增加相同的数 2.区间反转 3.区间滚动 4.插入一个数 5.删除一个数 6.查询一个区间内的最小值 我的Splay操作是学习《运用伸展树解决数列维护问题》的论文的,里面教的Splay和Rotate操作包括单纯的和加上更新操作两种。知道了Splay操作以后,...
阅读全文
hdu 3207 Highway
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3207 一道看上去好像是线段树的题,不过因为有两种操作(区间增加相同的数,以及将区间中比给出的数小的数更新成给出的数),所以用一般的线段数是不能正确更新的。这题应该是可以用线段树做的,因为在统计里的时间第一的人是貌似是用O(nlogn)的方法的。 一共三种操作: 1、如果区间连续,区间减少相同的数 2、区间增加相同的数 3、区间中比给出的数小的数都更新成给出的数 如果某个数小于等于0,那么那个数的位置断裂,而且不能修复! 这题一个比较简单的,而且不超时的方法是用类似二级检索的方法进行更新块状数组...
阅读全文
uva 12501 Bulky process of bulk reduction 线段树(mid)
摘要:UVa Online Judge 线段树的应用。【成段更新,成段查询】 因为每个位置都要乘上相应的权值,而且乘的大小依次递增,所以就要构建两棵线段树,一棵记录原始值,另外一个就乘上它所在位置的标号就好了。query的时候就直接两部分相减,得到答案。例如,第一棵树的结点记录为a[i],那么第二棵树的就是i*a[i]了。 其实这题不难,不过打上来是为了提醒自己注意延迟标记的更新。这题因为延迟标记更新搞错了,所以就产生了严重错误。同时,这次也要感谢Troy师兄,让我明白了debug还是要靠自己的,不是所有问题都有oj帮你检测代码是否通过,不是所有问题的解决都会有标程给你。所以,要证明一个算法没...
阅读全文
poj 2886 Who Gets the Most Candies?
摘要:http://poj.org/problem?id=2886 一道借助线段树找出第k个位置的题。 题意是,有n个人,他们手中拿着一张写着不为零的数的牌。开始的时候是从第k个人开始的,数到的人出列,然后从那个人的位置开始数d个人,d是他手上的牌的数字,数到的下一个出列,如此反复。第i个出列的人可以得到F(i)个糖果,F(i)是因数的个数。 这题主要问题在计算下一个人的位置时,如果next(也就是这个人手上拿的数)是负数的话,就要调整一下位置,因为这时的-1相当于是0了。然后质因数,就直接预处理一下,其他的都没什么大问题了。没调整负数的情况,wa了一次。。。代码如下:View Code 1...
阅读全文
poj 2777 Count Color
摘要:http://poj.org/problem?id=2777 简单线段树,【成段更新,成段查询】!View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 6 using namespace std; 7 8 #define lson l, m, rt << 1 9 #define rson m + 1, r, rt << 1 | 1 10 11 const int maxn = 1000
阅读全文
poj 2778 DNA Sequence
摘要:http://poj.org/problem?id=2778 跟上一篇一样,都是自动机加矩阵的题。不过这次因为忘记将答案取模了,所以wa了一次。。。- -这次的代码相对整齐了点,没有上一篇那么乱了。。。代码如下:View Code 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <map> 5 #include <algorithm> 6 #include <cassert> 7 8 using namespace std;
阅读全文
hdu 2243 考研路茫茫――单词情结
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2243 搞了4天题,今天终于AC了!!! 这是一道自动机的题,不过要用到矩阵的知识才能完成。所以,在我做这题之前,我先做了poj 3233(n次连续矩阵和)以及poj 2440(状态转移借助矩阵解)作为这题的基础! 题意很简单,就是求长度在1到L中,含有给出字符串的串的个数。直接解是比较难接触答案的,所以要借助反面情况,也就是求不含给出字符串的串的个数。然后用全体情况来减回去,就能得到最终答案了!模2^64,只要稍微有点常识的,都能想到直接用unsigned long long来储存,计算机会自动帮你模...
阅读全文
poj 2440 DNA (mid)
摘要:http://poj.org/problem?id=2440 题意是给出两种串,要求计算长度为L的,而且不含那两种子串的串的个数。 这个的做法主要是要靠状态转移,而且明白转移的技巧做这题就如鱼得水,轻松过了!长度为3的01串也就8种状态,如果我们把它编号了,以后添加一位的时候,根据最后三位,我们就可以从之前的装态将已统计的个数转移到现在当前这一层来。例如,0可以由0或4转移过来。 然后就可以简单的构造出矩阵来了!代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cassert&g
阅读全文
hdu 2276 Kiki & Little Kiki 2
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2276 还是矩阵快速幂的题,将异或的操作转换成矩阵乘法。1y!代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cassert> 4 #include <algorithm> 5 6 using namespace std; 7 8 const int maxSize = 100; 9 const int initMod = 1E9 + 7; 10 int curSize =
阅读全文
hdu 1757 A Simple Math Problem
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1757 如题,简单的矩阵快速幂。1y!View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cassert> 4 #include <algorithm> 5 6 using namespace std; 7 8 const int maxSize = 10; 9 const int initMod = 1E9 + 7;10 int curSize = maxSize;11 int curM
阅读全文
poj 1840 Eqs
摘要:http://poj.org/problem?id=1840 简单hash。。。。很想知道那些200ms以内的是怎么搞的。。。View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 const int mod = 4000037; 8 const int HASH = 0x20decade; 9 const int inf = 0x7fffffff;10 11 int hash[mod];12 int used
阅读全文
浙公网安备 33010602011771号