UPC11456 視線 計算幾何)

2021-09-24 10:48:28 字數 1612 閱讀 6885

視線

時間限制: 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...