E.New年と城の建設
問題の意味
与えられたn個の点は、各点について\(P \)、4点のサブセット(部分集合は、4つの点を有し、円は囲ま含み得ることP(\ \) )番号
ケース同一直線記載なしデータポイントありません
富栄Tiはまた、問題がある理解する問題に、独自の解決策を見つけた後、タイトルの質問の意味はよく理解されていません。
分析
円形の4つの点において、第1の5点。そうするためのプログラムの合計数\(N-C_ {*} ^。\ 1. 4-N-) 、列挙の中間点、残りの(N-1)番目の点四点から選択その後残り。
考えてみましょう\(N ^ 2 \)より大きなサブセットの場合、その逆の列挙を検討するため、非常に適切ではないすべてのシナリオの実行可能な選択肢を列挙前方に、アプローチを。
不正スキーム:他の4つのポイントとポイント含めることはできません\(P-を\) 。4つの列挙ポイント点\(Q \)は、プログラムの残りの3点の数を取って計算されます。検討\(P \)及び(Q \)\直線に接続され、一方の側から直線は3点が、そのような組み合わせは、4つの点を含む環を構成してはならないように求めることができる取ることができる\(Pを\ )。
どのようにすべての違法なスキームを削除するに漏れませんか?それぞれのための\(P \)、\ (Q \)四点として、および\(P \)最小点鎖線の勾配、次いでこれに基づき、唯一\(PQ \)が接続されています別のライン側に三点を取ります。このようなプログラムを期待することはできません\(pは\)何の繰り返しがない懸念しています。\(P \)それはすべてのプログラムを削除するためにサプリメントを漏洩することはできませんので列挙は、独立しています。
const int N = 3005;
long double x[N],y[N];
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
cin >> x[i] >> y[i];
}
ll res = 1ll * n * (n-1) * (n-2) * (n-3) * (n-4) / 24;
long double pi = acos(-1.0L);
for(int i=1;i<=n;i++){
vector<long double> v;
for(int j=1;j<=n;j++){
if(i == j)continue;
v.push_back(atan2(y[j]-y[i],x[j]-x[i]));
}
sort(v.begin(),v.end());
int m = n-1,index = 0;
for(int j=0;j<m;j++){
while(index < j + m){
long double ang = v[index%m] - v[j];
if(ang < 0) ang += 2 * pi;
if(ang < pi)index ++;
else break;
}
ll cnt = index - j - 1;
res -= 1ll * cnt * (cnt - 1) * (cnt - 2) / 6;
}
}
cout << res << endl;
return 0;
}
参考リンク
メインステーションBのアップ:https://www.bilibili.com/video/av82161298?p=411
PS:問題の解決はやや非常に明確で、主映像まで、長ったらしい、その後、私はこのソリューションの正確性についていくつかの追加の考えをした、貧しい人々の能力を表現し、読者は記述の誤りや場所は理解していない見つけた場合、以下のコメントを残してください、ありがとうございました!メインqscqesze説明アップ最後の感謝のB駅で。