上一页 1 ··· 31 32 33 34 35 36 37 38 39 ··· 85 下一页
  2012年3月30日
摘要: HDU_3308 这个题目可以用线段树去做。对于一个区间内最长的LCIS,要么在左儿子中,要么在右儿子中,要么就横跨在中间。 单点的更新操作还是比较好写的,因为其没有区间限制,只要依次更新线段树上的各个父节点即可。 查询操作就有区间限制了,但区间内最长的LCIS的性质还是没有变的,即要么在左儿子中,要么在右儿子中,要么横跨在中间。但由于有了区间的限制,我们在更新最优解的时候要对不同形态的区间分类讨论一下了。#include<stdio.h>#include<string.h>#define MAXD 100010int N, M, a[MAXD], mc[4 * MAX 阅读全文
posted @ 2012-03-30 01:30 Staginner 阅读(444) 评论(0) 推荐(0) 编辑
  2012年3月29日
摘要: POJ_3667 第一次接触区间合并的问题,更多区间合并的问题可以参考胡浩的博客http://www.notonlysuccess.com/index.php/segment-tree-complete/。 既然要查询是否存在一个长为d的连续空区间,那么我们至少要记录对于每个区间而言,其中的最长的连续空区间是多大,这个用mc[](max contiguous)表示。同时在查找的过程中,连续空区间有三种形式,在左子树,在右子树,或者横跨两棵子树。当然我们要优先找左子树,最后再找右子树,那么中间的这个横跨的怎么办呢?于是我们可以引入lc[](left contiguous)表示一个区间从左边开始. 阅读全文
posted @ 2012-03-29 22:19 Staginner 阅读(449) 评论(0) 推荐(0) 编辑
摘要: POJ_2449 一开始我的思路就是把图上每个点搞一个容量不小于K的最大堆和最小堆,最小堆用于取当前该节点的第某短路值,最大堆用来保存前K小的最短路。 最后为了每次能查询全局最小值,再把N个点放到一个线段树(最小堆)上即可,剩下的工作就是进行dij的过程了,当访问终点的次数达到第K次时break即可,这时就是第K短路的值了。 但这样会TLE,所以还是要用A*算法。 感觉A*就像是个优先级队列,从这个角度讲,dij本来也是A*算法,只不过其估价函数就等于起点到该点的最短距离。 而这个题目需要变一下估价函数,设g[i]为由某条路线从S到i点的路径长度,d[i]表示i点到T的最短路,那么我... 阅读全文
posted @ 2012-03-29 02:41 Staginner 阅读(316) 评论(0) 推荐(0) 编辑
摘要: POJ_3255 本来想做POJ_2449的,结果自己想的这个算法TLE,看来解决那个题只能搞A*了。 这个题目由于求次短路,第K短路的K就是2,比较小,所以可以直接用纯dij搞。我的思路就是把图上每个点搞一个容量不小于K的最大堆和最小堆,最小堆用于取到达当前该节点的第某短路值,最大堆用来保存前K小的最短路。 最后为了每次能查询全局最小值,再把N个点放到一个线段树(最小堆)上即可,剩下的工作就是进行dij的过程了,当访问终点的次数达到第K次时break即可,这时就是第K短路的值了。 当然,这么做其实是麻烦了,因为实际上K为2,所以可以直接把一个点拆成两个点,一个存当前最短路值,一个存次... 阅读全文
posted @ 2012-03-29 01:03 Staginner 阅读(337) 评论(0) 推荐(0) 编辑
  2012年3月28日
摘要: POJ_3635 可以把图上一个点拆成C+1个点然后直接应用dij即可,同时总状态是一定的,为了减少每一步的决策量,我们可以每次加油都只加1个单位。 貌似这样的题目用dij都会比SPFA快一些,因为状态比较多,而dij搜到终点就可以退出,这样相比SPFA减少了对很多无用状态的搜索量。#include<stdio.h>#include<string.h>#define MAXD 1010#define MAXM 20010#define MAXC 110#define MAXT 110000#define INF 0x3f3f3f3fint N, M, Q, D, S, 阅读全文
posted @ 2012-03-28 14:15 Staginner 阅读(433) 评论(0) 推荐(0) 编辑
  2012年3月27日
摘要: HYSBZ_1002 努力了一大节毛邓课,终于把这个题的递推公式写出来了O(∩_∩)O~ 由于推倒过程有点不好叙述,所以在此就只列出结论了,如果有什么疑问或者建议可以一起讨论哈。 设f[n]表示第n个原子和中心相连的病毒数,g[n]表示第n个原子不和中心相连的病毒数,那么最后的结果就是f[n]+g[n]。同时还需要一个辅助的表达式h[n],表示将环变成一条直链(首尾没有直接相连的线)后的病毒数(用h[n]去推其他表达式的时候可以看作是第n个原子和第1个原子不连线,而在计算h[n]的时候实际上也可以看成是第n-1个原子和第n个原子之间不连线,这样更容易得到h[n]=f[n-1]+2*h[n-1. 阅读全文
posted @ 2012-03-27 22:48 Staginner 阅读(1743) 评论(0) 推荐(0) 编辑
摘要: POJ_3613 这个题目我们可以用一个矩阵f[i][j][n]表示进过的边数为n的i到j的最短路,利用二分的思想就可以得到f[i][j][n]=min{f[i][k][n/2]+f[k][j][n-n/2]},这样就可以用快速幂去做了。只要先求得f[i][k][n/2],就可以利用f[i][k][n/2]求得f[k][j][n-n/2],于是一共只需要计算O(logn)个矩阵,每个矩阵是2维的,计算的时候可以用floyd。 此外,这个题目顶点的标号范围较大,但实际上点数很少,所以可以先将各个点做一次映射。#include<stdio.h>#include<string.h& 阅读全文
posted @ 2012-03-27 17:42 Staginner 阅读(350) 评论(0) 推荐(0) 编辑
  2012年3月26日
摘要: HYSBZ_1003 以前一直看不懂discuss的状态转移方程,后来某天早晨醒来的时候突然就发现我终于理解了……看来还是早晨的效率比较高。 可以用f[i]表示到第i天的时候最小费用,那么f[i]={f[j]+cost[j+1,i]+K}(0<=j<i),其中cost[i,j]表示由第i天到第j天都可以走得通的最短路。 这样求完之后再减去一个多余的K即可。#include<stdio.h>#include<string.h>#define MAXD 30#define DAY 110#define MAXQ 1010#define INF 0x3f3f3f3 阅读全文
posted @ 2012-03-26 17:15 Staginner 阅读(867) 评论(0) 推荐(0) 编辑
  2012年3月22日
摘要: ZOJ_2112 当自己学了splay之后,这个题目的基本思想就可以理解了,但代码还是写得相当挫,在后面的学习过程中再不断完善吧。 首先线段树可以完成对区间的限制,而平衡树则可以完成统计区间上不大于x的数,这样我们就可以在线段树的节点上放一棵平衡树,平衡树上有这个区间上所有的数。修改操作比较好完成,只要查找这个数在哪些区间中,并在对应的平衡树中更新相应的值即可。至于查询操作,我们可以先二分答案x,将问题转化成x是否可以作为第k大的数,然后只要统计区间中不大于x的数的数量n2,以及不大于x-1的数的数量n1,如果满足n1<k<=n2,那么自然x就是解了。 由于线段树有logn层,每层 阅读全文
posted @ 2012-03-22 17:36 Staginner 阅读(754) 评论(0) 推荐(0) 编辑
摘要: POJ_3468 (2) 第三次写这个题了,不过这次写的挺痛苦的,也是为了练基本的splay对区间的操作,不过写得比较挫…… 不过通过这次写splay的代码,感觉论文上rotate操作里面的push_down下传标记的操作是没有用的,因为调用rotate_to找对应节点的时候已经把标记都下传好了,而rotate操作也只是对rotate_to走过的路径上节点进行操作,因此该下传的就早已在调用rotate_to的时候下传完毕了。#include<stdio.h>#include<string.h>#define MAXD 100010int N, Q, T, node, l 阅读全文
posted @ 2012-03-22 00:16 Staginner 阅读(167) 评论(0) 推荐(0) 编辑
上一页 1 ··· 31 32 33 34 35 36 37 38 39 ··· 85 下一页