摘要: 首先容易知道,最后一个数是最容易确定的,于是从后往前确定 对于位置j,它的数就是1~n中剩余数的第a[j]+1小的数 这当然可以用平衡数做,复杂度为O(nlogn) 有没有更简洁得算法?树状数组+二分 1 var v:array[0..8010] of boolean; 2 c,ans,a:arra 阅读全文
posted @ 2014-03-02 11:11 acphile 阅读(113) 评论(0) 推荐(0) 编辑
摘要: 这里介绍怎么求k短路 A*搜索 估价函数f[i]=g[i]+h[i]; 在这里g[i]表示到达点i当前路径长,h[i]表示点i到达终点的最短距离 在搜索中,每次都取队列估价函数值最小的点,然后把它所能到达的点更新进入队列 显然这需要一个优先队列来维护(heap) 当终点第k次出队时,当前路径长度就是 阅读全文
posted @ 2014-03-02 11:02 acphile 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 奶牛来奶牛去的,用图论说白了就是 找统计有向图有多少个点,其他每个点都能到达这个点 考虑到一个特性,在一个强联通分量中,如果一个点能被其他所有点到达,那必定这个分量中其他点也一定符合要求 于是我们考虑用tarjan缩点(将一个强连通分量看做一个点) 缩点后,如果存在只有一个出度为0的点(必定存在,否 阅读全文
posted @ 2014-03-02 10:50 acphile 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 显然是一道最短路径的题目,但是 1 ≤ n ≤ 100000, 0 ≤ m ≤ 1000000能轻松打爆dij+heap 怎么办? 挖掘题意,这是一个DAG图(有向无环图) 所以对于此类问题,我们有特殊的作法 对于DAG,拓扑序列在前的点的最短路一定会被先更新(值得思考) 所以我们只用对DAG做一次 阅读全文
posted @ 2014-03-02 10:31 acphile 阅读(456) 评论(0) 推荐(0) 编辑
摘要: 统计长度为5的上升序列个数, 容易想到O(n^2)的dp f[k,i]:=Σf[k-1,j] (1<=j<i,a[i]>a[j]) ans:=Σf[5,i] 但是显然会超时,需要考虑优化 怎样快速找到所有比当前高度小的状态的和呢? 答案很显然:树状数组 考虑到这题每个数<=10^9,我们要将其离散化 阅读全文
posted @ 2014-03-02 10:16 acphile 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 很不错的hash 优化有两个方面:1.根据题目换一个更优化的算法 2.在算法运行过程中优化 这题除了暴力好像没别的办法了吧? 但是暴力也是有策略的! 到第i只牛特征为j的总数为sum[i,j]; 找到最大的区间(l,r]使得sum[r,1]-sum[l,1]=sum[r,2]-sum[l,2]…=s 阅读全文
posted @ 2014-02-10 15:35 acphile 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 很容易想到dp,f[i,j,k]表示到第i根木棒所组成三条边中两条边长为j,k是否存在 之后找所有满足三角形形成条件的三条边,然后找最大; 但: 如果你朴素的写,很有可能超时,事实上,只要加一些常数优化,就能卡过去 1 var a,s:array[0..50] of longint; 2 f:arr 阅读全文
posted @ 2014-02-10 14:37 acphile 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 这两题都体现了dp的核心:状态 dp做多就发现,状态一设计出来,后面的什么都迎刃而解了(当然需要优化的还要动动脑筋); 先说比较简单的; poj2436 由题得知病毒种数<=15很小,于是我们就容易想到将病每个牛携带的病毒抽象成15位的二进制数 0表示这种病毒不存在,1表示病毒存在,于是设cowi携 阅读全文
posted @ 2014-02-10 12:22 acphile 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 竟然生日前一天poj破百,不错不错,加速前进! poj2437 由于泥泞不重叠,所以按其实左边排个序再统计一遍即可(如果不是刚好盖满就尽量往后盖) poj2435 细节bfs poj2230 求欧拉回路,dfs即可 poj1330 简单的LCA poj2458 傻×穷举 poj2459 模拟水题 p 阅读全文
posted @ 2014-02-10 11:40 acphile 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 首先按限制高度排序,然后按多重背包做dp 这里的背包只用知道每种状态是否可行,所以 这里的多重背包可以变成O(nm) 1 const max=30000001; 2 var f:array[0..1,0..1010,0..4] of longint; 3 a,b:array[0..1010] of 阅读全文
posted @ 2014-02-10 11:25 acphile 阅读(206) 评论(0) 推荐(0) 编辑