摘要:
首先容易知道,最后一个数是最容易确定的,于是从后往前确定 对于位置j,它的数就是1~n中剩余数的第a[j]+1小的数 这当然可以用平衡数做,复杂度为O(nlogn) 有没有更简洁得算法?树状数组+二分 1 var v:array[0..8010] of boolean; 2 c,ans,a:arra 阅读全文
摘要:
这里介绍怎么求k短路 A*搜索 估价函数f[i]=g[i]+h[i]; 在这里g[i]表示到达点i当前路径长,h[i]表示点i到达终点的最短距离 在搜索中,每次都取队列估价函数值最小的点,然后把它所能到达的点更新进入队列 显然这需要一个优先队列来维护(heap) 当终点第k次出队时,当前路径长度就是 阅读全文
摘要:
奶牛来奶牛去的,用图论说白了就是 找统计有向图有多少个点,其他每个点都能到达这个点 考虑到一个特性,在一个强联通分量中,如果一个点能被其他所有点到达,那必定这个分量中其他点也一定符合要求 于是我们考虑用tarjan缩点(将一个强连通分量看做一个点) 缩点后,如果存在只有一个出度为0的点(必定存在,否 阅读全文
摘要:
显然是一道最短路径的题目,但是 1 ≤ n ≤ 100000, 0 ≤ m ≤ 1000000能轻松打爆dij+heap 怎么办? 挖掘题意,这是一个DAG图(有向无环图) 所以对于此类问题,我们有特殊的作法 对于DAG,拓扑序列在前的点的最短路一定会被先更新(值得思考) 所以我们只用对DAG做一次 阅读全文
摘要:
统计长度为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,我们要将其离散化 阅读全文