XSY3812 魚死網破(計算幾何?)

2021-10-14 13:47:41 字數 1990 閱讀 2497

先對於每個 x

xx 軸上方的點,找到所有牆,按照極角排序,合併重合的牆。

對於每乙個端點引一條射線,左端點的射線權值是 +1+1

+1,右端點是 −1-1

−1,可以發現乙個點不能看到的點數等於這個點左邊的射線的權值和。

觀察到這些直線都經過至少乙個牆的端點,可以將這些直線按照經過的端點分類,每一類內極角排序。然後查詢的時候對於每一堵牆二分查詢就好了。

時間複雜度 o(k

(n+m

)log⁡n

)o(k(n+m)\log n)

o(k(n+

m)logn)。

**如下:

#include

#define k 55

#define n 100010

#define eps 1e-11

using

namespace std;

intcompare

(double a,

double b)

struct point

;point

(int a,

int b)

double

get(

)}a[n]

,wall[k][2

];point operator

-(point a,point b)

struct line

;line

(double a,

int b,

int c)

}l[n]

[k<<1]

;bool

operator

<

(line a,line b)

int n,m,k,opt;

vector<

double

>deg[k][2

];bool

cmp(

double a,

double b)

intupper

(int i,

double x)

return ans+1;

}int

lower

(int i,

double x)

return ans+1;

}int

main()

for(

int i=

1;i<=n;i++

)sort

(l[i]+1

,l[i]

+(k<<1)

+1);

int tmp=0;

for(

int j=

1;j<=

(k<<1)

;j++

)else}}

for(

int i=

1;i<=k;i++

)for

(int j=

0;j<

2;j++

)sort

(deg[i]

[j].

begin()

,deg[i]

[j].

end(

),cmp)

;int ans=0;

for(

int i=

1;i<=m;i++

)printf

("%d\n"

,ans);}

return0;

}/*2 1 1 0

0 81 7

2 114514 6

8 -1

*/

我傻了,不應該用double直接算極角的,因為這樣精度要開到很小才能過,其實直接用叉乘來判斷兩條線的極角順序就好了。

每日一題3 8 1

a,b,c三個人是好朋友,每個人手裡都有一些糖果,我們不知道他們每個人手上具體有多少個糖果,但是我們知道以下的資訊 a b,b c,a b,b c.這四個數值.每個字母代表每個人所擁有的糖果數.現在需要通過這四個數值計算出每個人手裡有多少個糖果,即a,b,c。這裡保證最多只有一組整數a,b,c滿足所...

python3 8 1 類的繼承

class person object def init self,name 定義私有的變數 name self.name name 定義公有變數age weight self.age 10 self.weight 40 def get age self return self.age def ge...

XSY 3327 思維 跑步

題意 給你乙個nn的網格。初始時,每個網格有乙個非負權值。有n次操作。每次操作會將乙個網格的權值加1或減1。權值操作後仍非負 輸出當前每個網格到11的最長路 每步向上或向左 的總和。n 2000 n leqslant 2000 n 2000 解法 這是一道好題!我太菜了,做不出。我們考慮維護dp值。...