Educational Codeforces Round 73 (Rated for Div. 2)
传送门 F. Choose a Square 题意: 二维平面上给出 \(n\) 个点,每个点都有个权值。现在要求选择一个正方形,满足其中一根对角线的两顶点在 \(y=x\) 这条直线上。 问所选正方形包含了的点的权值和减去边长的最大值。 类似于这样: 答案为 \(4\) 。 思路: 因为正方形具有对称性,所以我们可以考虑将 \(y=x\) 这条直线下方的点对称过去处理,那么我们现在就相当于选择一个等腰直角三角形的区域,类似于这样: 注意到最终三角形的边上一定存在至少一个点,那么也就是说有用的横纵坐标就为这些点的坐标。 直接枚举 \(x,y\) 显然复杂度不能承受,考虑当我们枚举 \(x\) 时,选择一个最大的 \(y\) ,就类似于维护一个区间最大值。 对于一个位置 \(x=x_0\) ,显然随着 \(y\) 增大包含的点越多,并且对于一个 \(y=y_0\) 而言,与 \(y=x\) 这条直线所形成的三角形区域是必选的。类似于这样: 所以线段树的做法就很显然了,横坐标直接从后往前枚举,依次加点并且不断在线段树中插入点的信息并更新区间信息,查询的时候就直接查询最大值以及纵坐标即可。 为什么是更新区间最大值? 因为每插入一个点,它会影响在它右上方的点,当选择右上方的点时,它也必然被包含,类似于这样:(所以直接更新在其上方的区间信息即可) 注意一个细节,因为最后还要减去正方形的边长