視線
時間限制: 1 sec 記憶體限制: 128 mb
提交: 21 解決: 2
[提交] [狀態] [命題人:admin]
題目描述
二維平面上,原點處有乙個半徑為r的圓。平面上有n個點,保證沒有點在圓上或圓內,保證任意兩個點不與圓相切,求互相可以看見的點的對數。
看見:對於兩個點(x1,y1)和(x2,y2),他們的線段與圓沒有交點。
計算對數時,(a,b)和(b,a)視為相同,且(a,a)不算點對。
輸入第一行,兩個整數 n,r。
第 2 ~ n+1行,每行兩個整數,表示點的座標。
輸出一行,乙個整數,表示能互相看見的點的對數。
4 5
0 10
0 -10
10 0
-10 0
樣例輸出4
提示
對於40%的資料,n≤1000。
對於100%的資料,n≤50000。
點的座標為[−106,106]內的整數。
r的取值為[1,106]內的整數。
只能說昨天訓練的時候複雜度分析對了…… 但是沒想出來具體是要怎麼sort
如上圖所示,兩個點互相可見有兩種情況。
從a和b分別向圓做切線,會產生四個切點。
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1);
const double esp = 1e-9;
struct point a[maxn];
struct node e[maxn];
vectors;
int dtoicmp(double a)
int main() ;
if (dtoicmp(e[i].begin - 2 * pi) >= 0) e[i].begin -= 2 * pi;
if (dtoicmp(e[i].end - 2 * pi) >= 0) e[i].end -= 2 * pi;
if (dtoicmp(e[i].end - e[i].begin) <= 0) swap(e[i].end, e[i].begin);
s.push_back(e[i].begin);
s.push_back(e[i].end);
}long long ans = 0;
sort(s.begin(), s.end());
long long from, to;
for (int i = 0; i < n; i++)
cout << ans / 2 << endl;
return 0;
}
posted @
2019-05-22 19:24
albert_liu 閱讀(
...)
編輯收藏
AT1145 數學 素數
輸入n 1 2 3 n是素數輸出 wanwanwanwan 否則輸出 bowwowbowwow 賢 犬 holidog 足 算 素數判定 正整數 素數 尋 素數 wanwan bowwow 吠 11 nn 総和 1 2 3 n1 2 3 n 素數 尋 吠 出力 書 下 素數 11 數自身以外 正整數...
1145 簡單遊戲 easygame
題目描述 一天,小 r準備找小 h去游泳,當他找到小 h時,發現小 h正在痛苦地寫著一列數,1,2,3,n,於是就問小 h痛苦的原因,小 h告訴他,現在他要算 1.n 這些數裡面,1出現的次數是多少,如 n 11 的時候,有 1,10,11 共出現4次1 現在給出 n,你能快速給出答案麼?輸入 一行...
1145 北極通訊網路
解題報告 這道題實質上是在問滿足存在k個連通塊的最小d是多少。然而並不用二分,因為在kruskal演算法的過程中本身聯通塊的數目就是遞減的,從一開始的n到k然後記錄最小值就能ac這道題了。include include include include using namespace std cons...