09 2013 档案

摘要:首先讲一下RMQ算法的意思。RMQ(Range Minimum Query,RMQ)范围最小值,给出一个n个元素的数组,计算min(A[L],A[L+1],...,A[R-1],A[R]);这里运用了dp,先构建d[i][j]表示第i位开始2^j个元素中最小的值;转移方程d[i][j]=min(d[i][j-1],d[i+2^(j-1)][j-1]);建议画一张图来体验一下这个的意思。实现:1 void RMQ_init(int n)2 {3 for(int i=1;i=(R-L+1)/2;从L开始往右找2^(j-1)个元素的最小值,即d[L][j-1];以R结尾的连续的2^(j-1)... 阅读全文
posted @ 2013-09-26 12:06 howardcn 阅读(194) 评论(0) 推荐(0)
摘要:题意:迷宫里起火了,有若干个障碍物,有多个起火点,起火点每经过一个时间间隔就向它的上下左右相邻的格子扩散。有个倒霉的人好像叫做“Joe”,他要逃出来,他每次可以向上下左右任意移动一格,但是即要避开火也要避开障碍物,问你他如果逃得出来的话至少要多少步。没有着火点的话就直接,bfs了,但是有的话就稍微与处理一下,我们可以通过对着火点bfs,从而知道每个格子在什么时间着火。这样的话,只要先bfs着火点,把每个格子在什么时间着火保存到数组里;然后bfs那个人,在判断他可不可以那个格子的check函数增加一步,检查他走过去的时间是不是小于起火的时间。源代码: 1 #include 2 #inclu... 阅读全文
posted @ 2013-09-25 22:20 howardcn 阅读(517) 评论(0) 推荐(0)
摘要:对于我这样一名脑残ACMer选手,这道题看了好久好久大概4天,终于知道怎样把它和“树状数组”联系到一块了。树状数组是什么意思呢?用十个字归纳它:心里有数组,手中有前缀。为什么要用树状数组?假设你要储存一段数字的前缀和,还要动态修改这些数字。怎么办?通常的想法就是用数组a[]保存所有的数字,再用数组s[]保存每一位上的前缀和。1 for(int i=1;i=0)。令C[x]=A[x-lowbit(x)+1]+A[x-lowbit(x)+2]+...+A[x],那么每个C[x]都会对应一部分它的lowbit(x)范围内的A[i]。假如我要求x的前缀和,只要先取出C[x],再取出C[x-lowbit 阅读全文
posted @ 2013-09-24 22:03 howardcn 阅读(247) 评论(0) 推荐(0)
摘要:好久没写博客了,因为感觉时间比较紧,另一方面没有心思,做的题目比较浅也是另一方面。热身赛第二场被血虐了好不好,于是决定看看数位DP吧。进入正题:如题是一道经(简)典(单)的数位dp。第一步,对于数K^n-1这种形式的数,位数为n,它的各个位上,每个数0~K-1出现过的次数是一样的。于是对于数B=K^n-1,有f(B)=(B+1)*n*(0+1+2+...+K-1)/K=(B+1)*n*(K-1)/2;程序为:1 LL sum1(int pre,int n,int k)2 {3 LL ret=0;4 LL pw=1;5 for(int i=0;i=k){11 ... 阅读全文
posted @ 2013-09-12 14:54 howardcn 阅读(656) 评论(0) 推荐(0)