問題:天空可以理解為一條數軸,在這條數軸上分布著許多顆星星,對於每顆星星都有它的位置xi和自身的亮度bi。而窗戶所能看到的範圍是乙個給出的引數w,我們看到的星星也包括窗戶邊緣的星星。現在,要你求出調整窗戶位置後能看到星星的亮度之和最大值。
輸入格式:
一行n,w,分別代表星星的數量和窗戶的寬度
餘下n行,輸入xi和bi,代表星星的座標和亮度
輸出格式:
乙個數字,代表能看到星星的最大亮度和
輸入樣例#1:
6 3輸出樣例#1:1 22 4
3 84 4
5 21000 1
16對於10%的資料,w=0(沒有邊緣)說明:
對於40%的資料,w<=1000
對於100%的資料,n<=100000,w<=100000,xi<=100000,1<=bi<=100
除w=0的情況外,w均為》=3的奇數
在此主要講線段樹做法,若要沒接觸過的小夥伴建議去了解學習一下:
思路:明顯的線段樹板子唄,一段區間最亮,那不就是求一段區間和最大嘛。
#include#includeusing
namespace
std;
int a[100001
];long
long
n,m,ans,x,y,ch,max;
struct
ahahtree[
100001
<<2
];void build(int k,int l,int r) //
建樹。
long
long mid=(tree[k].l+tree[k].r)>>1
; build(k
<<1
,l,mid);
build(k
<<1|1,mid+1
,r);
//tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum; 開始不需要修改區間和。
}void update(int k) //
此處為單點修改
long
long mid=(tree[k].l+tree[k].r)>>1
;
if(x<=mid)update(k<<1
);
else update(k<<1|1
); tree[k].sum=tree[k<<1].sum+tree[k<<1|1
].sum;
}void query(int k) //
區間求和。
long
long mid=(tree[k].l+tree[k].r)>>1
;
if(x<=mid)query(k<<1
);
if(y>mid)query(k<<1|1);}
intmain()
long
long u=0
;
for(int i=1;i<=max-m+1;i++) //
列舉每段合適區間。
printf(
"%lld
",u); //
輸出就好了;
}
Luogu P3353 在你窗外閃耀的星星
題目 飛逝的的時光不會模糊我對你的記憶。難以相信從我第一次見到你以來已經過去了3年。我仍然還生動地記得,3年前,在美麗的集美中學,從我看到你微笑著走出教室,你將頭向後仰,柔和的晚霞照耀著你玫瑰色的臉頰。我明白,我已經沉醉於你了。之後,經過幾個月的觀察和窺探,你的優雅與智慧型,你對待生活的態度和你對未...
洛谷 3353 在你窗外閃耀的星星
傳送門 題目描述 飛逝的的時光不會模糊我對你的記憶。難以相信從我第一次見到你以來已經過去了 3 33 年。我仍然還生動地記得,3 33 年前,在美麗的集美中學,從我看到你微笑著走出教室,你將頭向後仰,柔和的晚霞照耀著你玫瑰色的臉頰。我明白,我已經沉醉於你了。之後,經過幾個月的觀察和窺探,你的優雅與智...
P3353 在你窗外閃耀的星星
飛逝的的時光不會模糊我對你的記憶。難以相信從我第一次見到你以來已經過去了3年。我仍然還生動地記得,3年前,在美麗的集美中學,從我看到你微笑著走出教室,你將頭向後仰,柔和的晚霞照耀著你玫瑰色的臉頰。我明白,我已經沉醉於你了。之後,經過幾個月的觀察和窺探,你的優雅與智慧型,你對待生活的態度和你對未來的願...