傳送門
貌似出題人給的方法一點都不友好qwq
那個如果乙個平面是有限的,那麼它被分為兩部分,這兩部分都是有限的。
假設我們要求的那條直線是y軸(不是也可以轉),那麼考慮對直線左右分別計算平面是否有限。
就直線右側而言,我們把交點按照順序排好。交點ya
和yb 之間的區間對應平面是有限的,當且僅當存在yc
和yd ,滿足yd
≤yb≤
ya≤y
c ,且kc
。 其中c,d可以是a,b,k代表交點對應直線斜率。
感性認識一下吧……
那麼先說一下把要求的直線旋到y軸的原因:好判斷啊,一邊的直線斜率全是連續的了。但是旋轉後平行難判,要用原始座標判斷。
那麼考慮一下如何維護相交。
我們肯定是維護乙個資料結構,然後來去除掉一些我們不需要的資訊。那麼看看下圖所示的情況:
如圖所示,紅線(a)和黑線(b)是已經處理完的直線,然後現在要進行計算的是藍線(c)
紅線和黑線滿足於這個關係yb且ka
那麼藍線如果要交黑線,肯定可以交紅線,而且交紅線可以封閉[y
a,yc
] 這一段區間(別吐槽我區間左右反過來的問題,我是從上往下考慮的),封閉的區間比與黑線交封閉的更大。
那麼實際上我們只是需要維護乙個序列(棧),滿足點對應的直線斜率遞減,加入序列的順序是從y座標大到小依次加入。
當有一條新直線來的時候,在序列中二分能交到哪,給區間頭尾打個標記(相當於差分)。
假如一條都交不到,加入序列(說明這條線斜率是目前最小)
直線左側做法和右側是完全一樣的,但是判斷與右側相反
最後按順序掃一下,假如直線兩側對應的區間都是有限,說明這段是有限的,反之無限。
#include
#include
#include
#define now e[i].k
#define n 100005
#define eps 0.00000000001
using
namespace
std;
bool f[n];
int l,r,mid,n,d[n],t,p[n];
long
double x1[n],y1[n],x2[n],y2[n],x,y;
long
long xx1[n],yy1[n],xx2[n],yy2[n];
struct mpoi
}e[n];
inline
void getpoi(const
int &i)
inline
bool cmp(const
int &i,const
int &j)
inline
void judge(const
int &f)
else d[++t]=i;
}int main()
for (int i=1;i<=n;i++) x2[i]-=x1[n],x1[i]-=x1[n],y2[i]-=y1[n],y1[i]-=y1[n];
long
double th=atan((y1[n]-y2[n])/(x1[n]-x2[n]))+3.14159265358979/2;
for (int i=1;i<=n;i++)
for (int i=1;iif (x2[i]1,e+n);
judge(1);
for (int i=1,tag=0;i<=n;p[e[i++].k]=0) if (tag+=p[now]) f[now]=1;
judge(0);
for (int i=1,tag=0;i<=n;i++) putchar(((tag+=p[now]) && f[now])?'1':'0');
}
UOJ 242 UR 16 破壞蛋糕
一句話題意 平面上有 n 1條直線,前 n 條直線把平面分成許多塊,這些塊有些面積有限,有些面積無限,而第 n 1 條直線不經過前 n 條直線的交點,且一定不和前 n 條直線中的任意一條平行,求第 n 1 條直線被前 n 條直線劃分成的 n 1 段中哪些在面積有限的塊裡,哪些在面積無限的塊裡。保證第...
uoj 242 UR 16 破壞蛋糕
uoj 考慮把那最後一條直線拎出來,並且旋轉到和 y 軸平行 其他直線同時一起旋轉 然後它和其他直線相交形成 n 1 個區間,現在要知道這些區間是否處在乙個面積有限的區域 可以發現一段在有限區域當且僅當區間的兩側區域都是有限的.所以對線的兩側分開考慮,先考慮左邊,如果直線的乙個區間旁邊的區域有限,那...
UOJ 192 UR 14 最強跳蚤
題目鏈結 暑期課第二天 樹上問題高階 具體內容看筆記部落格吧 題意n個節點的樹t 邊有邊權w 求滿足 u,v 上所有邊權乘積為完全平方數的路徑有多少條 看到 所有邊權乘積為完全平方數 想到完全平方數的特殊性 就是分解質因數後 質因數指數都為偶數 然後就想到分解邊權質因數 判質路徑邊權奇偶性 後者由於...