Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

很久前AC的,忘了怎么做了,代码也懒得看,于是重新想了一遍

Posted by cavatina2016 at 2020-10-26 13:16:57 on Problem 2445
在网格上画出所有从左下到右上的斜线,在同一条斜线上的所有点在同一组,分组处理。这个外层循环复杂度为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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator