Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
很久前AC的,忘了怎么做了,代码也懒得看,于是重新想了一遍在网格上画出所有从左下到右上的斜线,在同一条斜线上的所有点在同一组,分组处理。这个外层循环复杂度为O(N)。 现在处理同一条斜线上的点。注意到每个点在上下左右四个方向上都有延伸的线段,设它在四个方向上能连续延伸的最大距离分别为UP,DOWN,LEFT,RIGHT。假如有两个点A,B(A在B左边),它们之间距离的格子数为D(A,B),如果A,B能形成一个正方形的两个对角,需要满足 min(UP(A), RIGHT(A)) >= D(A,B) min(DOWN(B), LEFT(B)) >= D(A,B) 于是问题简化为:X轴上有一系列点,任意点P的位置为X(P),向X正方向延申的最大距离为F(P),向X反方向延申的最大距离为B(P)。统计满足下面条件的点对数: F(P1) >= |X(P1) - X(P2)| B(P2) >= |X(P1) - X(P2)| (P1在P2左边) 具体算法是保存一个线段树和一个小顶堆。线段树按X的值保存点,可以取某个范围的点个数;小顶堆按F+X的值排序堆里的点(F+X小的先POP)。 然后按X从小到大处理每个点。处理点P的过程如下: 1)把小顶堆里所有F+X值小于X(P)的点都pop出来,同时把它们从线段树中删除 2)求出线段树中范围在[X(P)-B(P),X(P)]的点个数,加入结果总数 3)把P加入小顶堆和线段树 这个过程复杂度为O(N * logN),于是总的时间复杂度为O(N * N * logN)。 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator