XSY3904 直線(分塊)

2021-10-20 07:34:11 字數 1400 閱讀 1907

直線

注意到題目沒有給什麼特殊的性質,除了直線隨機生成。

所以考慮隨機化演算法或均攤演算法。

有一種很神奇的分塊做法:

考慮將整個平面分成 b×b

b\times b

b×b 塊,每塊大小 109

b×10

9b

\dfrac\times\dfrac

b109​×

b109

​,而且每乙個塊記錄一下有哪些直線經過它,詢問的時候直接列舉經過詢問點所在塊內的所有直線並判斷統計。

分析一下時間複雜度:

首先是預處理,對於每一條直線,它經過的塊數大約為 b

bb,所以這部分的時間複雜度是 o(n

b)

o(nb)

o(nb)。

其次是詢問時列舉當前塊內的所有直線。剛剛我們得出了所有直線經過的塊數為 o(n

b)

o(nb)

o(nb

) 級別的,那麼每一塊均攤下來經過直線條數約是:nbb

2=nb

\dfrac=\dfrac

b2nb​=

bn​,所以這部分的時間複雜度是 o(q

nb

)o(q\dfrac)

o(qbn​

)。總時間複雜度 o(n

b+qn

b)

o(nb+q\dfrac)

o(nb+q

bn​)

,取 b=n

b=\sqrt

b=n​

即可。**如下:

#include

#define sn 350

#define n 100010

#define eps 1e-6

using

namespace std;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}int n,q,x[n][2

],y[n][2

];int block,len;

vector<

int>v[sn]

[sn]

;bool

compare

(double a,

double b)

intget

(double x)

intmain()

else

if(y[i][0

]==y[i][1

])else}}

while

(q--

)printf

("%d\n"

,ans);}

return0;

}

390 消除遊戲(python

題目 給定乙個從1 到 n 排序的整數列表。首先,從左到右,從第乙個數字開始,每隔乙個數字進行刪除,直到列表的末尾。第二步,在剩下的數字中,從右到左,從倒數第乙個數字開始,每隔乙個數字進行刪除,直到列表開頭。我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下乙個數字。返回長度為 n 的列表中...

python 實戰39 0的組合

題目內容 給定乙個包含若干個整數 可能存在重複整數 的列表,判斷其中是否存在三個元素a,b,c,使得a b c 0?找出所有滿足條件且不重複的這樣的三個數的組合。輸入格式 共一行,列表中元素以空格隔開。輸出格式 共一行,為不重複組合的個數,不存在這樣的組合就輸出0 輸入樣例 1 0 1 2 1 輸出...

LeetCode 390 消除遊戲

給定乙個從1 到 n 排序的整數列表。首先,從左到右,從第乙個數字開始,每隔乙個數字進行刪除,直到列表的末尾。第二步,在剩下的數字中,從右到左,從倒數第乙個數字開始,每隔乙個數字進行刪除,直到列表開頭。我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下乙個數字。返回長度為 n 的列表中,最後...