直線
注意到題目沒有給什麼特殊的性質,除了直線隨機生成。
所以考慮隨機化演算法或均攤演算法。
有一種很神奇的分塊做法:
考慮將整個平面分成 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 的列表中,最後...