摘要:operator new 的功能很简单, 就是分配一块连续的内存。 当我们写下::operator new时, 调用的实际上就是全局的operator new。 new operator 的功能就会复杂一些。 如果内存分配失败, 上述代码并不会返回一个空指针, 而是会抛出一个异常。 当我们写下上述代
阅读全文
摘要:#include using namespace std; pair a[100005], tmp[100005]; double ans; double getDis(const pair& lhs, const pair& rhs) { return (lhs.first-rhs.first)*(lhs.first-rhs.first) + (lhs.second-rhs.se...
阅读全文
摘要:template class shared_ptr { public: explicit shared_ptr (T *ptr): mPtr(ptr), cnt(new int(1)){} shared_ptr(const shared_ptr& rhs): mPtr(rhs.mPtr), cnt(rhs.cnt){ ++*cnt; } shared_ptr& oper...
阅读全文
摘要:题目链接 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. 求x的前驱(前驱定义为小于x,且最大的数)6. 求x的后继(后继定
阅读全文
摘要:题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子。 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少。 写了指针版本的kd树, 感觉这个版本很好理解。
阅读全文
摘要:题目链接 给n个点, 求出每个点到离它最近的点的距离。 直接建k-d树然后查询就可以 感觉十分神奇... 明白了算法原理但是感觉代码还不是很懂...
阅读全文
摘要:题目链接 给一个01矩阵, 然后每个询问给出两个坐标(x1, y1), (x2, y2)。 问你这个范围内的最大全1正方形的边长是多少。 我们dp算出以i, j为右下角的正方形边长最大值。 然后用二维st表预处理出所有的最大值。 对于每个询问, 我们二分一个值mid, 查询(x1 + mid -1,
阅读全文
摘要:题目链接 给n个位置, 每个位置有一个小球。 现在两个人进行操作, 每次操作可以选择一个位置i, 拿走一个小球。然后在位置j, k(i<j<=k)处放置一个小球。 问你先进行什么操作会先手必胜以及方法数量。 感觉这题好神 如果一个位置有偶数个小球, 那么等价于这个位置没有小球。 因为第二个人可以进行
阅读全文
摘要:题目链接 如果k==1, 显然就是直径。 k==2的时候, 把直径的边权变为-1, 然后在求一次直径。 变为-1是因为如果在走一次这条边, 答案会增加1. 学到了新的求直径的方法...
阅读全文
摘要:题目链接 给n个数, 这n个数的值是从小到大的, 给出个n个数的出现次数。 然后用他们组成一个bst。访问每一个数的代价是这个点的深度*这个点访问的次数。 问你代价最小值是多少。 区间dp的时候, 如果l >= r, 那么返回0, l == r-1, 返回两个数中小的一个。 其他情况的话枚举分界点进
阅读全文