YbtOJ 853 平面標記 整體二分,凸殼

2021-10-19 14:59:48 字數 3083 閱讀 8709

給出n

nn個點(xi

,yi)

(x_i,y_i)

(xi​,y

i​),m

mm次給出(ki

,ai)

(k_i,a_i)

(ki​,a

i​)表示標記所有滿足

y

j>ki

xjai

y_j>\frac}

yj​>xj

ai​​

ki​​

的未標記點

求每個點的標記時間

1 ≤n

,m≤1

05,1

<

101\leq n,m\leq 10^5,11≤

n,m≤

105,

1​<10

全是乘法所以可以先左右取lnln

ln就是ln(

yj

)>ln

(ki)

−ln(

xj)×

ai

ln(y_j)>ln(k_i)-ln(x_j)\times a_i

ln(yj​

)>ln

(ki​

)−ln

(xj​

)×ai

​把x,y,

kx,y,k

x,y,k取lnln

ln然後就是乙個順眼的式子

x j×

ai+y

i>ki

x_j\times a_i+y_i>k_i

xj​×ai

​+yi

​>ki

​雖然原題說(xi

,yi)

(x_i,y_i)

(xi​,y

i​)是點,但是我們可以換個思路,把(xi

,yi)

(x_i,y_i)

(xi​,y

i​)看成邊(f(z

)=xi

z+yi

f(z)=x_iz+y_i

f(z)=x

i​z+

yi​),(ai

,ki)

(a_i,k_i)

(ai​,k

i​)看成是點,然後問在每條邊下面的編號最小的點是哪個。

這個就很好解決了,考慮整體二分。每次要考慮對於一條邊是否有在[l,

mid]

[l,mid]

[l,mid

]編號的點在它下面。可以對於所有的[l,

mid]

[l,mid]

[l,mid

]的點拿出來構成乙個下凸殼,然後根據每條邊的斜率二分出乙個最下面的點,然後只拿這個點判斷就好了。

這樣就是o(n

log⁡2n

)o(n\log^2 n)

o(nlog2n

)的了,如果肯寫歸併排序和凸殼用單調佇列維護是可以做到o(n

log⁡n)

o(n\log n)

o(nlogn)

#include

#include

#include

#include

using

namespace std;

const

int n=

1e5+10;

int n,m,f[n]

,s[n]

,p[n]

,p1[n]

,p2[n]

,top,pos[n]

;double x[n]

,y[n]

,k[n]

,z[n]

;doublexj(

double x1,

double y1,

double x2,

double y2)

doublexl(

int a,

int b,

int c)

bool

cmp(

int x,

int y)

void

solve

(int ln,

int rn,

int lm,

int rm)

int mid=

(lm+rm)

>>

1;top=0;

sort

(pos+lm,pos+

1+mid,cmp)

;for

(int i=lm;i<=mid;i++

)sort

(pos+lm,pos+

1+mid)

;int cnt1=

0,cnt2=0;

for(

int i=ln;i<=rn;i++)if

(x[p[i]

]*z[s[l]

]+y[p[i]

]>k[s[l]

])p1[

++cnt1]

=p[i]

;else p2[

++cnt2]

=p[i];}

for(

int i=

1;i<=cnt1;i++

)p[i+ln-1]

=p1[i]

;for

(int i=

1;i<=cnt2;i++

)p[ln+cnt1+i-1]

=p2[i]

;solve

(ln,ln+cnt1-

1,lm,mid)

;solve

(ln+cnt1,rn,mid+

1,rm)

;return;}

intmain()

for(

int i=

1;i<=m;i++

)solve(1

,n,1

,m);

for(

int i=

1;i<=n;i++)if

(f[i]

==m)

puts

("-1");

else

printf

("%d\n"

,f[i]);

return0;

}

雷達裝置 Ybtoj

有n nn個建築物,第i ii個建築物在笛卡爾座標系上的座標為 xi yi x i,y i xi y i 你需要在x xx軸上安裝一些雷達,每個雷達的偵察半徑均為d dd,要求每個建築物都至少被乙個雷達偵測到,求最少要安裝幾個雷達。第一行兩個正整數n,d n,dn,d。接下來n nn行,第i ii行...

YBTOJ 電路維修

思路 乍一看這題,沒有bfs的頭緒 但是,我們想到了spfa 我們可以把地圖中的每個點看成方格,這樣就有 n 1 m 1 個方格 如果兩點之間有線聯通,那它們之間的邊權就是0,否則就為1 然後spfa就可以了 include include include using namespace std i...

YBTOJ 守衛挑戰

有 n 項任務,有乙個數 k 每一項任務成功的概率是 p i 這裡與原題目不同,原題目是百分之 p i 這裡相當於 p i frac 成功後會使 k 加上 a i 問至少成功 l 次且最後 k leq0 的概率是多少。資料範圍 0 leq k leq2000,0 leq l leq n leq 20...