- 博客(5)
- 收藏
- 关注
原创 uva11235(RMQ问题)
题目的意思是:有一个有序的数组,然后每次给出数组的两个端点L,R,要求出数组区间[L,R]里面出现最多的数字。 题目的解法:运用RMQ的思想求解即可,在求解之前需要转化一下模型,我们把这个数组可以转化为对于数字p,记录它的左端点位置nL[p],右端点位置nR[p],个数nV[p],对于每一次访问实际我们可以分三块来进行求解:首先是左端点num[L]的数字个数等于nR[num[L]] - L
2015-07-18 10:01:55 305
原创 LA4329(树状数组)
题目的大致意思是:有n个乒乓球手,然后他们都有一个能力值,然后需要每三个选手可以组成一场比赛,这场比赛要求,中间的那个人作为裁判,而且中间的人的能力值必须在两位选手之间,这个比赛才是合法的比赛,问这个这些选手一共能组织成多少场比赛? 解题思路:首先对单个人作为裁判进行研究,假设标号i的人,假设前面小于他能力值的人为C[i],那么前面大于他能力值的即为i - 1 - C[i],假设后面小于他能
2015-07-17 10:24:06 346
原创 uva(11997,求k个表的组合最小k个值)
题目大致的意思是有K个长度为K的数组,在每个数组中取一个元素求和,要求出所有和中前K小的。 解决的思路是: 首先我们可以想到两个有序数组进行求和时,可以看做有K个表: 1. A[0] + B[0] 2. A[1] + B[0] ... ... ... 我们可以用一个优先队列来维护,一开始先取每个表头的元素入
2015-07-15 17:03:11 255
原创 LA3027(并查集)
就是并查集维护连通分量,找到祖先节点(即根节点),我的代码不好的地方,在于路径压缩后的距离更新没写好,应该可以采取后序遍历的方法写距离的更新,代码如下: int find(int v){ if(v != father[v]){ int u = find(father[v]); dis[v] += dis[father[v]]; return father[v] = u; }
2015-07-14 16:38:41 277
原创 LA3644(并查集,维护连通分量的集合)
题目的大致意思就是要拒绝会使图中出现环的边,用一个并查集来进行维护,如果是同一个连通分量中的就拒绝。 #include "stdio.h"#include "string.h"#include "math.h"#include #include #include #include #include #include #include using namespace
2015-07-14 15:59:02 384
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人