boundary
題意:
2d平面上n個點,求這些點落在經過原點(0,0)的圓上的最大數量
思路:
有很多解法。
(1)比賽時根據圓的標準式 (x−
a)2+
(y−b
)2=r
2(x-a)^+(y-b)^=r^2
(x−a)2
+(y−
b)2=
r2又因為圓過原點 (0,
0)(0,0)
(0,0
) ,所以 r2=
a2+b
2r^2=a^2+b^2
r2=a2+
b2結合兩個式子進行化簡可得:x2+
y2=2
ax+2
byx^2+y^2=2ax+2by
x2+y2=
2ax+
2by選取兩個點 (x1
,y1)
,(x2
,y2)
(x_1,y_1),(x_2,y_2)
(x1,y
1),
(x2
,y2
) 可以解方程
x_1^2+y_1^2=2ax_1+2by_1\\ x_2^2+y_2^2=2ax_2+2by_2 \end
_=\cfrac
res=cn
2=2
n(n−
1)所以,答案 n=⌊
res×
2⌋+1
n=⌊\sqrt⌋+1
n=⌊res
×2⌋
+1注意:1、統計最大次數不可以用map,map會邊插入邊排序,原來 o(n
2)o(n^2)
o(n2
) 的複雜度就變成了 o(n
2log
n)o(n^2logn)
o(n2lo
gn) 只能過70%的資料無論是方法一還是方法二,但是官方題解複雜度也是 o(n
2log
n)o(n^2logn)
o(n2lo
gn)卻能ac就很玄學。
所以用vector存圓心,所有點列舉完後排序,使相鄰的點排在一起,統計相同點的最大次數。
2、解方程涉及除法,特判除數為0的情況,此時有兩種情況:一是 x1,
y2x1,y2
x1,y
2 或 x2,
y1x2,y1
x2,y
1 不為零,此時兩點乙個在x軸乙個在y軸上,其他情況下說明三點共線,不存在圓,方程無解。
#include
#include
#include
#include
#include
using
namespace std;
const
int n =
2e3+5;
struct point
;double
dis2
(point a, point b)
point a[n]
;int
main()
else
continue;}
else}}
sort
(ans.
begin()
,ans.
end())
;int res =
0, cnt =0;
pair<
double
,double
> tmp = ans[0]
;for
(auto i: ans)
else
} res =
max(cnt, res)
;printf
("%d",(
int)
sqrt
(res*2)
+1);
return0;
}
(2)
更為簡單的寫法,其實差不多,不過這裡可以用求三角形外心的模板,少了解方程裡的推公式步驟。
遍歷選取兩個點和原點組成三角形,求三角形的外心並將點存起來,找出被覆蓋最多次數的點即為圓心,次數的意義和方法(1)一樣,是在圓上的點組成的多邊形的邊數,得到邊數後求(int)sqrt(ans*2) +1就是答案。
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
typedef pair<
double
,double
> p;
const
int n =
2005
;struct point
;point a[n]
;vector
cc;inline
void
getc
(const point& p1,
const point& p2,
const point& p3, p& center)
//求三角形外心
intmain()
}}sort
(cc.
begin()
,cc.
end())
;int ans =
0, cnt =0;
p tmp = cc[0]
;for
(auto i: cc)
else
} ans =
max(cnt, ans)
;printf
("%d"
,int
(sqrt
(ans*2)
)+1)
;return0;
}
(3)標程做法,較為複雜
2020牛客多校第二場 A , J 題
j題 just shuffle 題意 已知置換 e 變換k次後得到乙個置換a 已知 求置換e變換一次得到的置換x。題解 這題我們能想到,對於變換規則,會存在一些環,意味著變換環的大小後置換不變。我們針對每個環考慮,設環的大小為len,變換一次的狀態等價於變換 len y 1 次,那我們從已知考慮,已...
2020牛客多校第二場G
題意 給你兩個序列,問你從第乙個序列中有多少個與第二個序列長度相同的並且對應位置都是大於等於第二個序列的子串。題解 神仙bitset題,維護第二個序列的bitset,例如樣例中的 2 3 3,按照大小排序後維護的m個bitset為 0100,0110,0111,樣例中的資料維護的bitset不是很好...
牛客多校第二場 J farm
輸入描述 the first line of input contains 3 integers n,m,t n m 1000000,t 1000000 for the next n lines,each line contains m integers in range 1,n m denotin...