YbtOJ 482 爬上山頂 凸殼,鍊錶

2021-10-19 12:04:49 字數 1672 閱讀 4368

n

nn個點,x

xx座標遞增,第i

ii個點向第j

jj個點連邊。

開始乙個人在點s

ss,他會向他看到過的y

yy座標最大的點的方向走(兩個點之間能夠看到當且僅當它們之間沒有邊或者點)。

求對於每個s

ss走到y

yy座標最大的點的經過點數。

y

yy值同樣的以編號大的算大

1 ≤n

≤5×1

05,1

≤xi,

yi≤1

06

1\leq n\leq 5\times 10^5,1\leq x_i,y_i\leq 10^6

1≤n≤5×

105,

1≤xi

​,yi

​≤10

6先考慮每個點能看到的最高的點。

維護乙個字首的上凸殼,然後每次把該點連線的那個點就是這個點在凸殼方向能看到的最高的點。

左右各做一次就好了。

然後考慮怎麼處理答案,先把所有點按照目標點的高度排序,然後每個點找到它的方向上在它前面的第乙個點作為它的真正目標點。然後倒序轉移就好了。

找真正目標點的過程可以反過來然後用鍊錶實現

時間複雜度o(n

log⁡n)

o(n\log n)

o(nlogn)

(寫基排就o(n

)o(n)

o(n)

了)

#include

#include

#include

#define ll long long

using

namespace std;

const ll n=

5e5+10;

ll n,x[n]

,y[n]

,pos[n]

,s[n]

,l[n]

,r[n]

,p[n]

,f[n]

;ll xj

(ll a,ll b,ll c)

bool

cmp(ll a,ll b)

signed

main()

top=

1;s[top]

=n;for

(ll i=n-

1;i>=

1;i--

)for

(ll i=

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

(y[p[i]

]*n+p[i]

*n+i)p[i]=0

; y[0]

=1e9

;sort

(pos+

1,pos+

1+n,cmp)

;for

(ll i=

1;i<=n;i++

) l[i]

=i-1

,r[i]

=i+1

;for

(ll i=

1;i)for

(ll i=n-

1;i>=

1;i--

)for

(ll i=

1;i<=n;i++

)printf

("%lld\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...