P1502 視窗的星星(掃瞄線入門第一題)

2022-05-06 15:33:09 字數 2370 閱讀 9885

提交2.78k

通過682

時間限制1.00s

記憶體限制125.00mb

提交**

加入收藏

題目提供者cyrcyr

難度省選/noi-

歷史分數100

提交記錄 

檢視題解

高效能高階資料結構

檢視演算法標籤

進入討論版

檢視討論

檢視推薦

展開小卡買到了一套新房子,他十分的高興,在房間裡轉來轉去。

晚上,小卡從陽台望出去,「哇~~~~好多星星啊」,但他還沒給其他房間設乙個窗戶,天真的小卡總是希望能夠在晚上能看到最多最亮的星星,但是窗子的大小是固定的,邊也必須和地面平行。這時小卡使用了超能力(透視術)知道了牆後面每個星星的位置和亮度,但是小卡發動超能力後就很疲勞,只好拜託你告訴他最多能夠有總和多亮的星星能出現在視窗上。

本題有多組資料,第一行為t 表示有t組資料t<=10

對於每組資料

第一行3個整數n,w,h,(n<=10000,1<=w,h<=1000000)表示有n顆星星,視窗寬為w,高為h。

接下來n行,每行三個整數xi,yi,li 表示星星的座標在(xi,yi),亮度為li。(0<=xi,yi<2^31)

t個整數,表示每組資料中視窗星星亮度總和的最大值。

輸入 #1複製

2

3 5 4

1 2 3

2 3 2

6 3 1

3 5 4

1 2 3

2 3 2

5 3 1

輸出 #1複製

5

6

小卡買的窗戶框是金屬做的,所以在邊框上的不算在內。

思路:就是掃瞄線的板子題,在這裡記錄一下自己理解的掃瞄線:

線段樹維護y軸區間,x軸暴力,這是掃瞄線的精髓。 相當於一條條線沿著x軸掃過去,看一下為什麼這樣能解決問題:

把每乙個星星作為左下角,在它的右上方劃出一片視窗大小的區域,表示只要視窗的右上角落在這一片區域裡就一定能覆蓋到這顆星星。

那麼不同星星的重疊部分就代表能同時覆蓋這幾顆星星了。

(下圖中(這裡是以星星為左下角,兩種方式都行),只要視窗落在陰影部分,就能同時覆蓋到三顆星星) 

看**:

#include#include

#include

#include

#include

using

namespace

std;

const

int maxn=4e4+5

;typedef

long

long

ll;ll ly[maxn

<<2];//

存所有的y 離散化

ll lazy[maxn<<2],ma[maxn<<2];//

線段樹延遲標記 存最大值

int len;//

struct

node

node[maxn<<2];//

存下所有的邊

bool cmp(const node a,const

node b)

void

push_down(ll rt)

void

update(ll l,ll r,ll rt,ll l,ll r,ll v)

ll mid=(l+r)>>1

;

if(lazy[rt]) push_down(rt);

if(l<=mid) update(l,mid,rt<<1

,l,r,v);

if(r>mid) update(mid+1,r,rt<<1|1

,l,r,v);

ma[rt]=max(ma[rt<<1],ma[rt<<1|1

]);}

ll getid(ll x)

intmain()

sort(ly+1,ly+p1+1

); len=unique(ly+1,ly+p1+1)-(ly+1

); sort(node+1,node+p+1

,cmp);

//for(int i=1;i<=p;i++) cout

;

for(int i=1;i<=p;i++)//

遍歷所有的邊

printf(

"%lld\n

",ans);

}return0;

}/**2

3 5 4

1 2 3

2 3 2

6 3 1

*/

P1502 視窗的星星

這道題還耗了我很久的時間,因為不懂得掃瞄線到底要怎麼做而一直翻了很多dalao的題解。這道題求的是乙個指定大小的矩形可以框住多少顆星星,他們的亮度總和最大。直接移動矩形不可行,我們將每顆星星轉換為每顆星星能被矩形框住的響應區域,不難發現也是矩形。為了不重複計算,我們只考慮在右上區域框住星星,不然會算...

Luogu 1502 視窗的星星 題解 掃瞄線

其實一眼看不出掃瞄線。我們可以把每乙個點都變成乙個長寬為w和h的矩形。左邊的邊是 w,右邊的邊是 w。線段樹維護區間max和lazy tag。然後掃瞄線求max。如下 include define ll long long using namespace std const int maxn 200...

P3353 在你窗外閃耀的星星

飛逝的的時光不會模糊我對你的記憶。難以相信從我第一次見到你以來已經過去了3年。我仍然還生動地記得,3年前,在美麗的集美中學,從我看到你微笑著走出教室,你將頭向後仰,柔和的晚霞照耀著你玫瑰色的臉頰。我明白,我已經沉醉於你了。之後,經過幾個月的觀察和窺探,你的優雅與智慧型,你對待生活的態度和你對未來的願...